summaryrefslogtreecommitdiff
path: root/elpa
diff options
context:
space:
mode:
Diffstat (limited to 'elpa')
-rw-r--r--elpa/archives/gnu/archive-contents5382
-rw-r--r--elpa/archives/gnu/archive-contents.signed1
-rw-r--r--elpa/archives/nongnu/archive-contents2881
-rw-r--r--elpa/archives/nongnu/archive-contents.signed1
-rw-r--r--elpa/evil-1.15.0.signed1
-rw-r--r--elpa/evil-1.15.0/.dir-locals.el3
-rw-r--r--elpa/evil-1.15.0/.github/ISSUE_TEMPLATE.md29
-rw-r--r--elpa/evil-1.15.0/.github/workflows/test.yml35
-rw-r--r--elpa/evil-1.15.0/CHANGES.org56
-rw-r--r--elpa/evil-1.15.0/CONTRIBUTING.md56
-rw-r--r--elpa/evil-1.15.0/Cask5
-rw-r--r--elpa/evil-1.15.0/Makefile121
-rw-r--r--elpa/evil-1.15.0/README.md82
-rw-r--r--elpa/evil-1.15.0/dir18
-rw-r--r--elpa/evil-1.15.0/doc/Makefile20
-rw-r--r--elpa/evil-1.15.0/doc/build/texinfo/evil.texi2271
-rw-r--r--elpa/evil-1.15.0/doc/docstringdb.json17584
-rw-r--r--elpa/evil-1.15.0/doc/front.pngbin0 -> 3258 bytes
-rw-r--r--elpa/evil-1.15.0/doc/logo.pngbin0 -> 2147 bytes
-rw-r--r--elpa/evil-1.15.0/doc/logo.svg110
-rw-r--r--elpa/evil-1.15.0/doc/make.bat35
-rw-r--r--elpa/evil-1.15.0/doc/source/_ext/elisp.py309
-rw-r--r--elpa/evil-1.15.0/doc/source/conf.py90
-rw-r--r--elpa/evil-1.15.0/doc/source/extension.rst146
-rw-r--r--elpa/evil-1.15.0/doc/source/faq.rst118
-rw-r--r--elpa/evil-1.15.0/doc/source/hooks.rst16
-rw-r--r--elpa/evil-1.15.0/doc/source/index.rst21
-rw-r--r--elpa/evil-1.15.0/doc/source/indices.rst6
-rw-r--r--elpa/evil-1.15.0/doc/source/internals.rst36
-rw-r--r--elpa/evil-1.15.0/doc/source/keymaps.rst145
-rw-r--r--elpa/evil-1.15.0/doc/source/license.rst447
-rw-r--r--elpa/evil-1.15.0/doc/source/overview.rst117
-rw-r--r--elpa/evil-1.15.0/doc/source/settings.rst195
-rw-r--r--elpa/evil-1.15.0/evil-autoloads.el109
-rw-r--r--elpa/evil-1.15.0/evil-command-window.el189
-rw-r--r--elpa/evil-1.15.0/evil-command-window.elcbin0 -> 7750 bytes
-rw-r--r--elpa/evil-1.15.0/evil-commands.el4897
-rw-r--r--elpa/evil-1.15.0/evil-commands.elcbin0 -> 267160 bytes
-rw-r--r--elpa/evil-1.15.0/evil-common.el4067
-rw-r--r--elpa/evil-1.15.0/evil-common.elcbin0 -> 121206 bytes
-rw-r--r--elpa/evil-1.15.0/evil-core.el1392
-rw-r--r--elpa/evil-1.15.0/evil-core.elcbin0 -> 44083 bytes
-rw-r--r--elpa/evil-1.15.0/evil-development.el50
-rw-r--r--elpa/evil-1.15.0/evil-development.elcbin0 -> 493 bytes
-rw-r--r--elpa/evil-1.15.0/evil-digraphs.el1729
-rw-r--r--elpa/evil-1.15.0/evil-digraphs.elcbin0 -> 30552 bytes
-rw-r--r--elpa/evil-1.15.0/evil-ex.el1188
-rw-r--r--elpa/evil-1.15.0/evil-ex.elcbin0 -> 32618 bytes
-rw-r--r--elpa/evil-1.15.0/evil-integration.el511
-rw-r--r--elpa/evil-1.15.0/evil-integration.elcbin0 -> 32518 bytes
-rw-r--r--elpa/evil-1.15.0/evil-jumps.el354
-rw-r--r--elpa/evil-1.15.0/evil-jumps.elcbin0 -> 15936 bytes
-rw-r--r--elpa/evil-1.15.0/evil-keybindings.el124
-rw-r--r--elpa/evil-1.15.0/evil-keybindings.elcbin0 -> 3919 bytes
-rw-r--r--elpa/evil-1.15.0/evil-macros.el817
-rw-r--r--elpa/evil-1.15.0/evil-macros.elcbin0 -> 21744 bytes
-rw-r--r--elpa/evil-1.15.0/evil-maps.el643
-rw-r--r--elpa/evil-1.15.0/evil-maps.elcbin0 -> 23689 bytes
-rw-r--r--elpa/evil-1.15.0/evil-pkg.el2
-rw-r--r--elpa/evil-1.15.0/evil-repeat.el646
-rw-r--r--elpa/evil-1.15.0/evil-repeat.elcbin0 -> 16753 bytes
-rw-r--r--elpa/evil-1.15.0/evil-search.el1336
-rw-r--r--elpa/evil-1.15.0/evil-search.elcbin0 -> 41414 bytes
-rw-r--r--elpa/evil-1.15.0/evil-states.el937
-rw-r--r--elpa/evil-1.15.0/evil-states.elcbin0 -> 58329 bytes
-rw-r--r--elpa/evil-1.15.0/evil-test-helpers.el418
-rw-r--r--elpa/evil-1.15.0/evil-test-helpers.elcbin0 -> 13415 bytes
-rw-r--r--elpa/evil-1.15.0/evil-tests.el9386
-rw-r--r--elpa/evil-1.15.0/evil-tests.elcbin0 -> 885600 bytes
-rw-r--r--elpa/evil-1.15.0/evil-types.el462
-rw-r--r--elpa/evil-1.15.0/evil-types.elcbin0 -> 19778 bytes
-rw-r--r--elpa/evil-1.15.0/evil-vars.el2084
-rw-r--r--elpa/evil-1.15.0/evil-vars.elcbin0 -> 73405 bytes
-rw-r--r--elpa/evil-1.15.0/evil.el158
-rw-r--r--elpa/evil-1.15.0/evil.elcbin0 -> 610 bytes
-rw-r--r--elpa/evil-1.15.0/evil.info2235
-rw-r--r--elpa/exwm-0.33.signed1
-rw-r--r--elpa/exwm-0.33/.elpaignore2
-rw-r--r--elpa/exwm-0.33/exwm-autoloads.el224
-rw-r--r--elpa/exwm-0.33/exwm-background.el204
-rw-r--r--elpa/exwm-0.33/exwm-background.elcbin0 -> 7762 bytes
-rw-r--r--elpa/exwm-0.33/exwm-core.el438
-rw-r--r--elpa/exwm-0.33/exwm-core.elcbin0 -> 19034 bytes
-rw-r--r--elpa/exwm-0.33/exwm-floating.el793
-rw-r--r--elpa/exwm-0.33/exwm-floating.elcbin0 -> 21051 bytes
-rw-r--r--elpa/exwm-0.33/exwm-input.el1223
-rw-r--r--elpa/exwm-0.33/exwm-input.elcbin0 -> 43786 bytes
-rw-r--r--elpa/exwm-0.33/exwm-layout.el618
-rw-r--r--elpa/exwm-0.33/exwm-layout.elcbin0 -> 20721 bytes
-rw-r--r--elpa/exwm-0.33/exwm-manage.el830
-rw-r--r--elpa/exwm-0.33/exwm-manage.elcbin0 -> 26614 bytes
-rw-r--r--elpa/exwm-0.33/exwm-pkg.el2
-rw-r--r--elpa/exwm-0.33/exwm-randr.el396
-rw-r--r--elpa/exwm-0.33/exwm-randr.elcbin0 -> 14881 bytes
-rw-r--r--elpa/exwm-0.33/exwm-systemtray.el693
-rw-r--r--elpa/exwm-0.33/exwm-systemtray.elcbin0 -> 25106 bytes
-rw-r--r--elpa/exwm-0.33/exwm-workspace.el1773
-rw-r--r--elpa/exwm-0.33/exwm-workspace.elcbin0 -> 59082 bytes
-rw-r--r--elpa/exwm-0.33/exwm-xim.el807
-rw-r--r--elpa/exwm-0.33/exwm-xim.elcbin0 -> 24034 bytes
-rw-r--r--elpa/exwm-0.33/exwm-xsettings.el323
-rw-r--r--elpa/exwm-0.33/exwm-xsettings.elcbin0 -> 11166 bytes
-rw-r--r--elpa/exwm-0.33/exwm.el1143
-rw-r--r--elpa/exwm-0.33/exwm.elcbin0 -> 34072 bytes
-rw-r--r--elpa/gnupg/pubring.kbxbin0 -> 2779 bytes
-rw-r--r--elpa/gnupg/pubring.kbx~bin0 -> 1572 bytes
-rw-r--r--elpa/gnupg/trustdb.gpgbin0 -> 1200 bytes
-rw-r--r--elpa/gruber-darker-theme-0.7.signed1
-rw-r--r--elpa/gruber-darker-theme-0.7/README-elpa78
-rw-r--r--elpa/gruber-darker-theme-0.7/README.md78
-rw-r--r--elpa/gruber-darker-theme-0.7/gruber-darker-theme-autoloads.el29
-rw-r--r--elpa/gruber-darker-theme-0.7/gruber-darker-theme-pkg.el2
-rw-r--r--elpa/gruber-darker-theme-0.7/gruber-darker-theme.el400
-rw-r--r--elpa/xelb-0.20.signed1
-rw-r--r--elpa/xelb-0.20/.elpaignore2
-rw-r--r--elpa/xelb-0.20/Makefile30
-rw-r--r--elpa/xelb-0.20/xcb-bigreq.el48
-rw-r--r--elpa/xelb-0.20/xcb-bigreq.elcbin0 -> 2572 bytes
-rw-r--r--elpa/xelb-0.20/xcb-composite.el116
-rw-r--r--elpa/xelb-0.20/xcb-composite.elcbin0 -> 14810 bytes
-rw-r--r--elpa/xelb-0.20/xcb-cursor.el432
-rw-r--r--elpa/xelb-0.20/xcb-cursor.elcbin0 -> 16520 bytes
-rw-r--r--elpa/xelb-0.20/xcb-damage.el112
-rw-r--r--elpa/xelb-0.20/xcb-damage.elcbin0 -> 10523 bytes
-rw-r--r--elpa/xelb-0.20/xcb-dbe.el162
-rw-r--r--elpa/xelb-0.20/xcb-dbe.elcbin0 -> 20199 bytes
-rw-r--r--elpa/xelb-0.20/xcb-debug.el135
-rw-r--r--elpa/xelb-0.20/xcb-debug.elcbin0 -> 4049 bytes
-rw-r--r--elpa/xelb-0.20/xcb-dpms.el134
-rw-r--r--elpa/xelb-0.20/xcb-dpms.elcbin0 -> 16720 bytes
-rw-r--r--elpa/xelb-0.20/xcb-dri2.el322
-rw-r--r--elpa/xelb-0.20/xcb-dri2.elcbin0 -> 38624 bytes
-rw-r--r--elpa/xelb-0.20/xcb-dri3.el228
-rw-r--r--elpa/xelb-0.20/xcb-dri3.elcbin0 -> 25029 bytes
-rw-r--r--elpa/xelb-0.20/xcb-ewmh.el752
-rw-r--r--elpa/xelb-0.20/xcb-ewmh.elcbin0 -> 172168 bytes
-rw-r--r--elpa/xelb-0.20/xcb-ge.el52
-rw-r--r--elpa/xelb-0.20/xcb-ge.elcbin0 -> 2827 bytes
-rw-r--r--elpa/xelb-0.20/xcb-glx.el1861
-rw-r--r--elpa/xelb-0.20/xcb-glx.elcbin0 -> 244469 bytes
-rw-r--r--elpa/xelb-0.20/xcb-icccm.el563
-rw-r--r--elpa/xelb-0.20/xcb-icccm.elcbin0 -> 83243 bytes
-rw-r--r--elpa/xelb-0.20/xcb-keysyms.el813
-rw-r--r--elpa/xelb-0.20/xcb-keysyms.elcbin0 -> 23234 bytes
-rw-r--r--elpa/xelb-0.20/xcb-present.el269
-rw-r--r--elpa/xelb-0.20/xcb-present.elcbin0 -> 22975 bytes
-rw-r--r--elpa/xelb-0.20/xcb-randr.el1121
-rw-r--r--elpa/xelb-0.20/xcb-randr.elcbin0 -> 129377 bytes
-rw-r--r--elpa/xelb-0.20/xcb-record.el213
-rw-r--r--elpa/xelb-0.20/xcb-record.elcbin0 -> 23776 bytes
-rw-r--r--elpa/xelb-0.20/xcb-render.el763
-rw-r--r--elpa/xelb-0.20/xcb-render.elcbin0 -> 80990 bytes
-rw-r--r--elpa/xelb-0.20/xcb-renderutil.el296
-rw-r--r--elpa/xelb-0.20/xcb-renderutil.elcbin0 -> 6116 bytes
-rw-r--r--elpa/xelb-0.20/xcb-res.el195
-rw-r--r--elpa/xelb-0.20/xcb-res.elcbin0 -> 24403 bytes
-rw-r--r--elpa/xelb-0.20/xcb-screensaver.el164
-rw-r--r--elpa/xelb-0.20/xcb-screensaver.elcbin0 -> 14144 bytes
-rw-r--r--elpa/xelb-0.20/xcb-shape.el187
-rw-r--r--elpa/xelb-0.20/xcb-shape.elcbin0 -> 19933 bytes
-rw-r--r--elpa/xelb-0.20/xcb-shm.el170
-rw-r--r--elpa/xelb-0.20/xcb-shm.elcbin0 -> 17179 bytes
-rw-r--r--elpa/xelb-0.20/xcb-sync.el340
-rw-r--r--elpa/xelb-0.20/xcb-sync.elcbin0 -> 43152 bytes
-rw-r--r--elpa/xelb-0.20/xcb-systemtray.el142
-rw-r--r--elpa/xelb-0.20/xcb-systemtray.elcbin0 -> 17200 bytes
-rw-r--r--elpa/xelb-0.20/xcb-types.el912
-rw-r--r--elpa/xelb-0.20/xcb-types.elcbin0 -> 43304 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xc_misc.el79
-rw-r--r--elpa/xelb-0.20/xcb-xc_misc.elcbin0 -> 7797 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xembed.el184
-rw-r--r--elpa/xelb-0.20/xcb-xembed.elcbin0 -> 23705 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xevie.el105
-rw-r--r--elpa/xelb-0.20/xcb-xevie.elcbin0 -> 12951 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xf86dri.el213
-rw-r--r--elpa/xelb-0.20/xcb-xf86dri.elcbin0 -> 30241 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xf86vidmode.el550
-rw-r--r--elpa/xelb-0.20/xcb-xf86vidmode.elcbin0 -> 59762 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xfixes.el454
-rw-r--r--elpa/xelb-0.20/xcb-xfixes.elcbin0 -> 59786 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xim.el1022
-rw-r--r--elpa/xelb-0.20/xcb-xim.elcbin0 -> 109424 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xinerama.el123
-rw-r--r--elpa/xelb-0.20/xcb-xinerama.elcbin0 -> 16426 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xinput.el2976
-rw-r--r--elpa/xelb-0.20/xcb-xinput.elcbin0 -> 313511 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xkb.el2315
-rw-r--r--elpa/xelb-0.20/xcb-xkb.elcbin0 -> 180900 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xlib.el112
-rw-r--r--elpa/xelb-0.20/xcb-xlib.elcbin0 -> 3497 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xprint.el414
-rw-r--r--elpa/xelb-0.20/xcb-xprint.elcbin0 -> 57439 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xproto.el3012
-rw-r--r--elpa/xelb-0.20/xcb-xproto.elcbin0 -> 312700 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xselinux.el392
-rw-r--r--elpa/xelb-0.20/xcb-xselinux.elcbin0 -> 56236 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xsettings.el88
-rw-r--r--elpa/xelb-0.20/xcb-xsettings.elcbin0 -> 7091 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xtest.el87
-rw-r--r--elpa/xelb-0.20/xcb-xtest.elcbin0 -> 7844 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xv.el523
-rw-r--r--elpa/xelb-0.20/xcb-xv.elcbin0 -> 56159 bytes
-rw-r--r--elpa/xelb-0.20/xcb-xvmc.el188
-rw-r--r--elpa/xelb-0.20/xcb-xvmc.elcbin0 -> 22009 bytes
-rw-r--r--elpa/xelb-0.20/xcb.el883
-rw-r--r--elpa/xelb-0.20/xcb.elcbin0 -> 29081 bytes
-rw-r--r--elpa/xelb-0.20/xelb-autoloads.el253
-rwxr-xr-xelpa/xelb-0.20/xelb-gen726
-rw-r--r--elpa/xelb-0.20/xelb-pkg.el2
-rw-r--r--elpa/xelb-0.20/xelb-test.el96
-rw-r--r--elpa/xelb-0.20/xelb-test.elcbin0 -> 3209 bytes
-rw-r--r--elpa/xelb-0.20/xelb.el70
-rw-r--r--elpa/xelb-0.20/xelb.elcbin0 -> 149 bytes
213 files changed, 99531 insertions, 0 deletions
diff --git a/elpa/archives/gnu/archive-contents b/elpa/archives/gnu/archive-contents
new file mode 100644
index 0000000..aebf533
--- /dev/null
+++ b/elpa/archives/gnu/archive-contents
@@ -0,0 +1,5382 @@
+(1
+ (a68-mode .
+ [(1 0)
+ ((emacs
+ (24 3)))
+ "Major mode for editing Algol 68 code" tar
+ ((:url . "https://git.sr.ht/~jemarch/a68-mode")
+ (:keywords "languages")
+ (:maintainer "Jose E. Marchesi" . "jemarch@gnu.org")
+ (:authors
+ ("Omar Polo" . "op@omarpolo.com"))
+ (:commit . "2a191fae4c73839d34d19c086ec75af35a0937e4"))])
+ (ace-window .
+ [(0 10 0)
+ ((avy
+ (0 5 0)))
+ "Quickly switch windows." tar
+ ((:url . "https://github.com/abo-abo/ace-window")
+ (:keywords "window" "location")
+ (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
+ (:authors
+ ("Oleh Krehel" . "ohwoeowho@gmail.com"))
+ (:commit . "7003c88cd9cad58dc35c7cd13ebc61c355fb5be7"))])
+ (ack .
+ [(1 11)
+ nil "interface to ack-like tools" tar
+ ((:url . "https://github.com/leoliu/ack-el")
+ (:keywords "tools" "processes" "convenience")
+ (:maintainer "João Távora" . "joaotavora@gmail.com")
+ (:authors
+ ("Leo Liu" . "sdl.web@gmail.com"))
+ (:commit . "90c90a80322aa9f26ce88f2f24a224afc4c994b8"))])
+ (activities .
+ [(0 7 2)
+ ((emacs
+ (29 1))
+ (persist
+ (0 6)))
+ "Save/restore sets of windows, tabs/frames, and their buffers" tar
+ ((:url . "https://github.com/alphapapa/activities.el")
+ (:keywords "convenience")
+ (:maintainer "Adam Porter" . "adam@alphapapa.net")
+ (:authors
+ ("Adam Porter" . "adam@alphapapa.net"))
+ (:commit . "a7e7842c615e149ad7d7e57f383936b49dcb129f"))])
+ (ada-mode .
+ [(8 1 0)
+ ((uniquify-files
+ (1 0 4))
+ (wisi
+ (4 3 0))
+ (gnat-compiler
+ (1 0 3))
+ (emacs
+ (25 3)))
+ "major-mode for editing Ada sources" tar
+ ((:url . "https://www.nongnu.org/ada-mode/")
+ (:keywords "languages" "ada")
+ (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
+ (:commit . "357ac189bea640023e33214e8efe9288d9d1416c"))])
+ (ada-ref-man .
+ [(2020 1)
+ nil "Ada Reference Manual 2012" tar
+ ((:url . "http://stephe-leake.org/ada/arm.html")
+ (:keywords "languages" "ada")
+ (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@member.fsf.org"))
+ (:commit . "b86a173c1488989fd06f0b612e7b7acee9fda070"))])
+ (adaptive-wrap .
+ [(0 8)
+ nil "Smart line-wrapping with wrap-prefix" tar
+ ((:maintainer
+ ("Stephen Berman" . "stephen.berman@gmx.net")
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:authors
+ ("Stephen Berman" . "stephen.berman@gmx.net")
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/adaptive-wrap.html")
+ (:commit . "026c35f59174febab2bcdb3c50fb8344c248671c"))])
+ (adjust-parens .
+ [(3 2)
+ ((emacs
+ (24 3)))
+ "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 . "https://elpa.gnu.org/packages/adjust-parens.html")
+ (:commit . "a7e0ece3037821ea438fe401ade6d3c60b3d24e0"))])
+ (advice-patch .
+ [(0 1)
+ ((emacs
+ (24 4)))
+ "Use patches to advise the inside of functions" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/advice-patch.html")
+ (:commit . "b0575729f34d1c45f1b47d8793e84311a4770826"))])
+ (aggressive-completion .
+ [(1 7)
+ ((emacs
+ (27 1)))
+ "Automatic minibuffer completion" tar
+ ((:keywords "minibuffer" "completion")
+ (:maintainer "Tassilo Horn" . "tsdh@gnu.org")
+ (:authors
+ ("Tassilo Horn" . "tsdh@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/aggressive-completion.html")
+ (:commit . "d92bf2428133b6e261780e16b7030afe91d3668e"))])
+ (aggressive-indent .
+ [(1 10 0)
+ ((emacs
+ (24 3)))
+ "Minor mode to aggressively keep your code always indented" tar
+ ((:url . "https://github.com/Malabarba/aggressive-indent-mode")
+ (:keywords "indent" "lisp" "maint" "tools")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:commit . "cb416faf61c46977c06cf9d99525b04dc109a33c"))])
+ (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")
+ (:keywords "ahungry" "palette" "color" "theme" "emacs" "color-theme" "deftheme")
+ (:maintainer "Matthew Carter" . "m@ahungry.com")
+ (:authors
+ ("Matthew Carter" . "m@ahungry.com"))
+ (:commit . "45bf75f17752c8e8dd4c8a4531c0aa419cdccb84"))])
+ (aircon-theme .
+ [(0 0 6)
+ ((emacs
+ (24 4)))
+ "Cool and legible light theme" tar
+ ((:url . "https://git.sr.ht/~chambln/aircon-theme.el")
+ (:keywords "faces")
+ (:maintainer "Gregory Chamberlain" . "~chambln/public-inbox@lists.sr.ht")
+ (:authors
+ ("Gregory Chamberlain" . "greg@cosine.blue"))
+ (:commit . "0cecd81e7f6631c91ed0437d801517677e018c1d"))])
+ (all .
+ [(1 1)
+ ((emacs
+ (24 3)))
+ "Edit all lines matching a given regexp" tar
+ ((:keywords "matching")
+ (:maintainer "Per Abrahamsen" . "per.abrahamsen@gmail.com")
+ (:authors
+ ("Per Abrahamsen" . "per.abrahamsen@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/all.html")
+ (:commit . "55aa1ac8853d81040aec0b3a2bd43200923146fd"))])
+ (altcaps .
+ [(1 3 0)
+ ((emacs
+ (27 1)))
+ "Apply alternating letter casing to convey sarcasm or mockery" tar
+ ((:url . "https://github.com/protesilaos/altcaps")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "2606eafb4352a0c4a2d9f3a760ff234020772d8d"))])
+ (ampc .
+ [(0 2)
+ nil "Asynchronous Music Player Controller" tar
+ ((:keywords "ampc" "mpc" "mpd")
+ (:maintainer "Christopher Schmidt" . "christopher@ch.ristopher.com")
+ (:authors
+ ("Christopher Schmidt" . "christopher@ch.ristopher.com"))
+ (:url . "https://elpa.gnu.org/packages/ampc.html")
+ (:commit . "70e1a282a9d91c3cab9d87e613259891e124aa35"))])
+ (arbitools .
+ [(0 977)
+ ((cl-lib
+ (0 5)))
+ "Package for chess tournaments administration" tar
+ ((:maintainer "David Gonzalez Gandara" . "dggandara@member.fsf.org")
+ (:authors
+ ("David Gonzalez Gandara" . "dggandara@member.fsf.org"))
+ (:url . "https://elpa.gnu.org/packages/arbitools.html")
+ (:commit . "93f48b7964909f92bdb410557a01db433826b95e"))])
+ (ascii-art-to-unicode .
+ [(1 13)
+ nil "a small artist adjunct" tar
+ ((:url . "http://www.gnuvola.org/software/aa2u/")
+ (:keywords "ascii" "unicode" "box-drawing")
+ (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org")
+ (:authors
+ ("Thien-Thi Nguyen" . "ttn@gnu.org"))
+ (:commit . "83ec71af9e1812df781b78f28fa9dac0ff7b61bc"))])
+ (assess .
+ [(0 7)
+ ((emacs
+ (24 4))
+ (m-buffer
+ (0 15)))
+ "Test support functions" tar
+ ((:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk")
+ (:authors
+ ("Phillip Lord" . "phillip.lord@russet.org.uk"))
+ (:url . "https://elpa.gnu.org/packages/assess.html")
+ (:commit . "cadeb24a5d8261fad4bdfdc09e7d571cc395a6ca"))])
+ (async .
+ [(1 9 9)
+ ((emacs
+ (24 4)))
+ "Asynchronous processing in Emacs" tar
+ ((:url . "https://github.com/jwiegley/emacs-async")
+ (:keywords "async")
+ (:maintainer "Thierry Volpiatto" . "thievol@posteo.net")
+ (:authors
+ ("John Wiegley" . "jwiegley@gmail.com"))
+ (:commit . "f317b0c9c3e60a959f45d035ed5e31a78f1263ac"))])
+ (auctex .
+ [(14 0 9)
+ ((emacs
+ (27 1)))
+ "Integrated environment for *TeX*" tar
+ ((:url . "https://www.gnu.org/software/auctex/")
+ (:keywords "tex" "latex" "texinfo" "context" "doctex" "preview-latex")
+ (:maintainer nil . "auctex-devel@gnu.org")
+ (:commit . "ee58d625501af073bde569718db02d1236162283"))])
+ (auctex-cont-latexmk .
+ [(0 3)
+ ((emacs
+ (29 3))
+ (auctex
+ (14 0 5)))
+ "run latexmk continuously, report errors via Flymake" tar
+ ((:url . "https://github.com/ultronozm/auctex-cont-latexmk.el")
+ (:keywords "tex")
+ (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com")
+ (:authors
+ ("Paul D. Nelson" . "nelson.paul.david@gmail.com"))
+ (:commit . "5bd2e6f96fad055e4c3f7d22109aa6573b927406"))])
+ (auctex-label-numbers .
+ [(0 2)
+ ((emacs
+ (27 1))
+ (auctex
+ (14 0 5)))
+ "Numbering for LaTeX previews and folds" tar
+ ((:url . "https://github.com/ultronozm/auctex-label-numbers.el")
+ (:keywords "tex")
+ (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com")
+ (:authors
+ ("Paul D. Nelson" . "nelson.paul.david@gmail.com"))
+ (:commit . "202e49bb9f754bc647deb112bd2c35f9a583b942"))])
+ (aumix-mode .
+ [(7)
+ nil "run the aumix program in a buffer" tar
+ ((:url . "http://user42.tuxfamily.org/aumix-mode/index.html")
+ (:keywords "multimedia" "mixer" "aumix")
+ (:maintainer "Kevin Ryde" . "user42_kevin@yahoo.com.au")
+ (:authors
+ ("Kevin Ryde" . "user42_kevin@yahoo.com.au"))
+ (:commit . "72db1f3ee04f3d1db17487d5bd98466fcbad87fd"))])
+ (auth-source-xoauth2-plugin .
+ [(0 1 1)
+ ((emacs
+ (28 1))
+ (oauth2
+ (0 17)))
+ "authentication source plugin for xoauth2" tar
+ ((:maintainer "Xiyue Deng" . "manphiz@gmail.com")
+ (:authors
+ ("Xiyue Deng" . "manphiz@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/auth-source-xoauth2-plugin.html")
+ (:commit . "21b361839286b174698bae4258ec893dc5f5c27d"))])
+ (auto-correct .
+ [(1 1 4)
+ nil "Remembers and automatically fixes past corrections" tar
+ ((:keywords "editing")
+ (:maintainer "Ian Dunn" . "dunni@gnu.org")
+ (:authors
+ ("Ian Dunn" . "dunni@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/auto-correct.html")
+ (:commit . "0d38425fad4cd96714c07cfa66983b20764ff518"))])
+ (auto-header .
+ [(0 1 2)
+ nil "Automatically find the right C headers" tar
+ ((:url . "https://git.sr.ht/~pkal/auto-header")
+ (:keywords "c")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "f366c1bf15abd33a8c035438b68b6b854bf2bd1a"))])
+ (auto-overlays .
+ [(0 10 10)
+ ((cl-lib
+ (0 5)))
+ "Automatic regexp-delimited overlays" tar
+ ((:url . "http://www.dr-qubit.org/tags/computing-code-emacs.html")
+ (:keywords "extensions")
+ (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
+ (:authors
+ ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
+ (:commit . "0807a75d2606462ef636b737e8f3873f98141a82"))])
+ (autocrypt .
+ [(0 4 2)
+ ((emacs
+ (24 3)))
+ "Autocrypt implementation" tar
+ ((:url . "https://git.sr.ht/~pkal/autocrypt")
+ (:keywords "comm")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "dc0223f11daf526621fda206b38bf06c29759c94"))])
+ (autorevert-tail-truncate .
+ [(1 0 1)
+ ((emacs
+ (29 1)))
+ "auto-revert-tail your files with RAM control" tar
+ ((:url . "https://github.com/shipmints/autorevert-tail-truncate.el")
+ (:keywords "convenience" "tools" "log files" "autorevert")
+ (:maintainer "Stephane Marks" . "shipmints@gmail.com")
+ (:authors
+ ("Stephane Marks" . "shipmints@gmail.com"))
+ (:commit . "b54df5838159abf760a48de2fd33b21cabd12e66"))])
+ (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 2 4)
+ ((emacs
+ (24))
+ (cl-lib
+ (0 5)))
+ "Big Brother DataBase" tar
+ ((:maintainer "Roland Winkler" . "winkler@gnu.org")
+ (:url . "https://elpa.gnu.org/packages/bbdb.html")
+ (:commit . "641ff1f309e65ac8bd9794bd5f72cfc9ffc297a4"))])
+ (beacon .
+ [(1 3 4)
+ ((emacs
+ (25 1)))
+ "Highlight the cursor whenever the window scrolls" tar
+ ((:url . "https://github.com/Malabarba/beacon")
+ (:keywords "convenience")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:commit . "0cf8b60f62876f3e75653a5fb30d5d5cdd74c586"))])
+ (beframe .
+ [(1 3 0)
+ ((emacs
+ (28 1)))
+ "Isolate buffers per frame" tar
+ ((:url . "https://github.com/protesilaos/beframe")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "94b5122122959ea38cf257916edaf29e4ab02949"))])
+ (bicep-ts-mode .
+ [(0 1 4)
+ nil "tree-sitter support for Bicep" tar
+ ((:url . "https://github.com/josteink/bicep-ts-mode")
+ (:keywords "bicep" "languages" "tree-sitter")
+ (:maintainer "Jostein Kjønigsen" . "jostein@kjonigsen.net")
+ (:authors
+ ("Jostein Kjønigsen" . "jostein@kjonigsen.net"))
+ (:commit . "625d03d1f63e4a35a9e62dd4d8b06d80134109d8"))])
+ (bind-key .
+ [(2 4 1)
+ nil "A simple way to manage personal keybindings" tar
+ ((:url . "https://github.com/jwiegley/use-package")
+ (:keywords "keys" "keybinding" "config" "dotemacs")
+ (:maintainer "John Wiegley" . "johnw@newartisans.com")
+ (:authors
+ ("John Wiegley" . "johnw@newartisans.com"))
+ (:commit . "4932ed21d40f9e8ad48ad2a1f086fdf9b3847ac9"))])
+ (blist .
+ [(0 6)
+ ((ilist
+ (0 4))
+ (emacs
+ (24)))
+ "Display bookmarks in an ibuffer way" tar
+ ((:url . "https://gitlab.com/mmemmew/blist")
+ (:keywords "convenience")
+ (:maintainer "Durand" . "durand@jsdurand.xyz")
+ (:authors
+ ("Durand" . "durand@jsdurand.xyz"))
+ (:commit . "e3894193fd7602483e0132b82f1b0afbcebe654d"))])
+ (bluetooth .
+ [(0 4 1)
+ ((emacs
+ (26 1))
+ (dash
+ (2 18 1))
+ (compat
+ (30 0 0 0))
+ (transient
+ (0 5 0)))
+ "A mode for interacting with Bluetooth devices" tar
+ ((:url . "https://codeberg.org/rstocker/emacs-bluetooth")
+ (:keywords "hardware")
+ (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de")
+ (:authors
+ ("Raffael Stocker" . "r.stocker@mnet-mail.de")
+ ("Etienne Prud homme" . "e.e.f.prudhomme@gmail.com"))
+ (:commit . "db880e306e00f51e5456b7388371ad6329452165"))])
+ (bnf-mode .
+ [(0 4 5)
+ ((cl-lib
+ (0 5))
+ (emacs
+ (24 3)))
+ "Major mode for editing BNF grammars." tar
+ ((:url . "https://github.com/sergeyklay/bnf-mode")
+ (:keywords "languages")
+ (:maintainer "Serghei Iakovlev" . "egrep@protonmail.ch")
+ (:authors
+ ("Serghei Iakovlev" . "egrep@protonmail.ch"))
+ (:commit . "a4fe013fc945d8396930bc6d0dcc1cf9d7102f41"))])
+ (boxy .
+ [(2 0 0)
+ ((emacs
+ (26 1)))
+ "A boxy layout framework" tar
+ ((:url . "https://gitlab.com/grinn.amy/boxy")
+ (:keywords "tools")
+ (:maintainer "Amy Grinn" . "grinn.amy@gmail.com")
+ (:authors
+ ("Amy Grinn" . "grinn.amy@gmail.com"))
+ (:commit . "c019061cbb3b8a3c93e1720ff4532ef915173adb"))])
+ (boxy-headings .
+ [(2 1 10)
+ ((emacs
+ (26 1))
+ (boxy
+ (2 0))
+ (org
+ (9 4)))
+ "View org files in a boxy diagram" tar
+ ((:url . "https://gitlab.com/grinn.amy/boxy-headings")
+ (:keywords "tools")
+ (:maintainer "Amy Grinn" . "grinn.amy@gmail.com")
+ (:authors
+ ("Amy Grinn" . "grinn.amy@gmail.com"))
+ (:commit . "d9ff199273bd96011fe5bfe20cafab57dc189930"))])
+ (breadcrumb .
+ [(1 0 1)
+ ((emacs
+ (28 1))
+ (project
+ (0 9 8)))
+ "project and imenu-based breadcrumb paths" tar
+ ((:maintainer "João Távora" . "joaotavora@gmail.com")
+ (:authors
+ ("João Távora" . "joaotavora@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/breadcrumb.html")
+ (:commit . "ff5fb77e2556c42aee9f1131f824bdfb955d861f"))])
+ (brief .
+ [(5 92)
+ ((nadvice
+ (0 3))
+ (cl-lib
+ (0 5)))
+ "Brief Editor Emulator (Brief Mode)" tar
+ ((:keywords "brief" "emulations" "crisp")
+ (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com")
+ (:authors
+ ("Luke Lee" . "luke.yx.lee@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/brief.html")
+ (:commit . "58c2f484100fecd89248c476e3baf222cda5c7c7"))])
+ (buffer-env .
+ [(0 6)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1)))
+ "Buffer-local process environments" tar
+ ((:url . "https://github.com/astoff/buffer-env")
+ (:keywords "processes" "tools")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "3814bdf3585ffffea3014b1d01549894ec1aa897"))])
+ (buffer-expose .
+ [(0 4 3)
+ ((emacs
+ (25))
+ (cl-lib
+ (0 5)))
+ "Visual buffer switching using a window grid" tar
+ ((:url . "https://github.com/clemera/buffer-expose")
+ (:keywords "convenience")
+ (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
+ (:authors
+ ("Clemens Radermacher" . "clemera@posteo.net"))
+ (:commit . "c4a1c745123b86c15ba7bb4858255b5252e8440a"))])
+ (bufferlo .
+ [(0 8)
+ ((emacs
+ (27 1)))
+ "Manage frame/tab-local buffer lists" tar
+ ((:url . "https://github.com/florommel/bufferlo")
+ (:keywords "buffer" "frame" "tabs" "local")
+ (:maintainer "Florian Rommel" . "mail@florommel.de")
+ (:authors
+ ("Florian Rommel" . "mail@florommel.de"))
+ (:commit . "44f0ca8ef39f201ec929bd68462cb66ff6b442b4"))])
+ (bug-hunter .
+ [(1 3 1)
+ ((seq
+ (1 3))
+ (cl-lib
+ (0 5)))
+ "Hunt down errors by bisecting elisp files" tar
+ ((:url . "https://github.com/Malabarba/elisp-bug-hunter")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:keywords "lisp"))])
+ (buildbot .
+ [(0 0 1)
+ ((emacs
+ (28)))
+ "A Buildbot client for emacs" tar
+ ((:url . "https://g.ypei.me/buildbot.el.git")
+ (:keywords "buildbot" "continuous integration")
+ (:maintainer "Yuchen Pei" . "id@ypei.org")
+ (:authors
+ ("Yuchen Pei" . "id@ypei.org"))
+ (:commit . "d614eea91ca5717c2b0019dae8c85e6a24873f39"))])
+ (calibre .
+ [(1 4 1)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1 4 1)))
+ "Interact with Calibre libraries from Emacs" tar
+ ((:url . "https://git.disroot.org/kjartanoli/calibre.el")
+ (:maintainer "Kjartan Oli Agustsson" . "kjartanoli@disroot.org")
+ (:authors
+ ("Kjartan Oli Agustsson" . "kjartanoli@disroot.org"))
+ (:commit . "855a9cb092eecf1e5c17ea56c440a0200f95eb4c"))])
+ (cape .
+ [(2 0)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "Completion At Point Extensions" tar
+ ((:url . "https://github.com/minad/cape")
+ (:keywords "abbrev" "convenience" "matching" "completion" "text")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:authors
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "2e86b6deed2844fc1345ff01bc92c3a849a33778"))])
+ (capf-autosuggest .
+ [(0 3)
+ ((emacs
+ (25 1)))
+ "History autosuggestions for comint and eshell" tar
+ ((:url . "https://repo.or.cz/emacs-capf-autosuggest.git")
+ (:maintainer "jakanakaevangeli" . "jakanakaevangeli@chiru.no")
+ (:authors
+ ("jakanakaevangeli" . "jakanakaevangeli@chiru.no"))
+ (:commit . "6d66f0ce52c6a41945a48e7b562dd6d262c62cd9"))])
+ (caps-lock .
+ [(1 0)
+ nil "Caps-lock as a minor mode" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/caps-lock.html")
+ (:commit . "ce94899c7619e748e8a811ad8cdeb09918e7ecd8"))])
+ (captain .
+ [(1 0 3)
+ nil "CAPiTalization is Automatic IN emacs" tar
+ ((:keywords "editing")
+ (:maintainer "Ian Dunn" . "dunni@gnu.org")
+ (:authors
+ ("Ian Dunn" . "dunni@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/captain.html")
+ (:commit . "a341d4cf3288ebae410c1c9124b82a9e421f3779"))])
+ (chess .
+ [(2 0 5)
+ ((cl-lib
+ (0 5)))
+ "Play chess in GNU Emacs" tar
+ ((:keywords "games")
+ (:maintainer "Mario Lang" . "mlang@delysid.org")
+ (:authors
+ ("John Wiegley" . "johnw@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/chess.html")
+ (:commit . "c98602f7b1aa7b74c708008209e698d0886a529c"))])
+ (cl-generic .
+ [(0 3)
+ nil "Forward cl-generic compatibility for Emacs<25" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/cl-generic.html")
+ (:commit . "d90985eee35afd48b96aa8f14e0d0c8a67ce62c9"))])
+ (cl-lib .
+ [(0 7 1)
+ nil "Forward cl-lib compatibility library for Emacs<24.3" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/cl-lib.html")
+ (:commit . "80dc6223f2e25db1f4b38d5c48365553abd793fc"))])
+ (clipboard-collector .
+ [(0 3)
+ ((emacs
+ (25)))
+ "Collect clipboard entries according to regex rules" tar
+ ((:url . "https://github.com/clemera/clipboard-collector")
+ (:keywords "convenience")
+ (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
+ (:authors
+ ("Clemens Radermacher" . "clemera@posteo.net"))
+ (:commit . "ee4a0ee506c47666714cd61649334936d67e5a43"))])
+ (cobol-mode .
+ [(1 1)
+ ((cl-lib
+ (0 5)))
+ "Mode for editing COBOL code" tar
+ ((:keywords "languages")
+ (:maintainer "Edward Hart" . "edward.dan.hart@gmail.com")
+ (:authors
+ ("Edward Hart" . "edward.dan.hart@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/cobol-mode.html")
+ (:commit . "bd7879daa71908616277688ba51d27b60c88b0a2"))])
+ (code-cells .
+ [(0 5)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1)))
+ "Lightweight notebooks with support for ipynb files" tar
+ ((:url . "https://github.com/astoff/code-cells.el")
+ (:keywords "convenience" "outlines")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "caffb420be106cebbdfe4474ed0507a601603f83"))])
+ (colorful-mode .
+ [(1 2 3)
+ ((emacs
+ (28 1))
+ (compat
+ (30 0 2 0)))
+ "Preview any color in your buffer in real time" tar
+ ((:url . "https://github.com/DevelopmentCool2449/colorful-mode")
+ (:keywords "faces" "tools" "matching" "convenience")
+ (:maintainer
+ ("Jen-Chieh" . "jcs090218@gmail.com")
+ ("Elias G. Perez" . "eg642616@gmail.com"))
+ (:authors
+ ("Elias G. Perez" . "eg642616@gmail.com"))
+ (:commit . "f749116188d4be195050c2c96baf5b7899734dab"))])
+ (comint-mime .
+ [(0 7)
+ ((emacs
+ (28 1))
+ (compat
+ (29 1))
+ (mathjax
+ (0 1)))
+ "Display content of various MIME types in comint buffers" tar
+ ((:url . "https://github.com/astoff/comint-mime")
+ (:keywords "processes" "multimedia")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "5e7b609a4f8c4ba8ec6d1d994c01143b79b93c33"))])
+ (compact-docstrings .
+ [(0 2)
+ nil "Shrink blank lines in docstrings and doc comments" tar
+ ((:url . "https://github.com/cpitclaudel/compact-docstrings")
+ (:keywords "convenience" "faces" "lisp" "maint" "c")
+ (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com")
+ (:authors
+ ("Clément Pit-Claudel" . "clement.pitclaudel@live.com"))
+ (:commit . "50b9ec928193f339c3c2ae20f088ea62cc82bb9d"))])
+ (company .
+ [(1 0 2)
+ ((emacs
+ (25 1)))
+ "Modular text completion framework" tar
+ ((:url . "http://company-mode.github.io/")
+ (:keywords "abbrev" "convenience" "matching")
+ (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev")
+ (:commit . "393940f76aec1f2500441d4e0b97f783acbb536b"))])
+ (company-ebdb .
+ [(1 1)
+ ((company
+ (0 9 4))
+ (ebdb
+ (0 2)))
+ "company-mode completion backend for EBDB in message-mode" tar
+ ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
+ (:authors
+ ("Jan Tatarik" . "jan.tatarik@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/company-ebdb.html")
+ (:commit . "f4b8ad408a068f2c3d07782cb111db4d62fd69d8"))])
+ (company-math .
+ [(1 5 1)
+ ((company
+ (0 8 0))
+ (math-symbol-lists
+ (1 3)))
+ "Completion backends for unicode math symbols and latex tags" tar
+ ((:url . "https://github.com/vspinu/company-math")
+ (:keywords "unicode" "symbols" "completion")
+ (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com")
+ (:authors
+ ("Vitalie Spinu" . "spinuvit@gmail.com"))
+ (:commit . "3eb006874e309ff4076d947fcbd61bb6806aa508"))])
+ (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")
+ (:keywords "abbrev" "convenience" "matching")
+ (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com")
+ (:authors
+ ("Ingo Lohmar" . "i.lohmar@gmail.com"))
+ (:commit . "e62157d43b2c874d2edbd547c3bdfb05d0a7ae5c"))])
+ (compat .
+ [(30 0 2 0)
+ ((emacs
+ (24 4))
+ (seq
+ (2 23)))
+ "Emacs Lisp Compatibility Library" tar
+ ((:url . "https://github.com/emacs-compat/compat")
+ (:keywords "lisp" "maint")
+ (:maintainer "Compat Development" . "~pkal/compat-devel@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "e87b984bf763aa6c574dde58b3cb4458b3b7db17"))])
+ (cond-star .
+ [(1 0)
+ ((emacs
+ (24 3)))
+ "Extended form of `cond' construct" tar
+ ((:maintainer "Richard Stallman" . "rms@gnu.org")
+ (:url . "https://elpa.gnu.org/packages/cond-star.html")
+ (:commit . "4719df9f42c157e2683ac641883cff5efaa480bc"))])
+ (constants .
+ [(2 11 1)
+ ((emacs
+ (24 1)))
+ "Enter definition of constants into source code" tar
+ ((:url . "https://github.com/cdominik/constants-for-Emacs")
+ (:keywords "programming" "languages")
+ (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com")
+ (:authors
+ ("Carsten Dominik" . "carsten.dominik@gmail.com"))
+ (:commit . "f07e221d4d5597c7ccf4b0003c0909a88bdfcc9e"))])
+ (consult .
+ [(2 1)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "Consulting completing-read" tar
+ ((:url . "https://github.com/minad/consult")
+ (:keywords "matching" "files" "completion")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:commit . "d557305b730f7666d46bc3eb04c87cfcc493a8e5"))])
+ (consult-denote .
+ [(0 2 4)
+ ((emacs
+ (28 1))
+ (denote
+ (3 0 3))
+ (consult
+ (1 7)))
+ "Use Consult in tandem with Denote" tar
+ ((:url . "https://github.com/protesilaos/consult-denote")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "e07001ce3ded4b226f59264d3c8162761580c052"))])
+ (consult-hoogle .
+ [(0 5 0)
+ ((emacs
+ (27 1))
+ (consult
+ (2 0)))
+ "Hoogle frontend using consult" tar
+ ((:url . "https://codeberg.org/rahguzar/consult-hoogle")
+ (:keywords "docs" "languages")
+ (:maintainer "rahguzar" . "rahguzar@mailbox.org")
+ (:authors
+ ("rahguzar" . "rahguzar@mailbox.org"))
+ (:commit . "384959016022d071464dc6e611e4fcded562834e"))])
+ (consult-recoll .
+ [(1 0 0)
+ ((emacs
+ (26 1))
+ (consult
+ (2 0)))
+ "Recoll queries using consult" tar
+ ((:url . "https://codeberg.org/jao/consult-recoll")
+ (:keywords "docs" "convenience")
+ (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org")
+ (:authors
+ ("Jose A Ortega Ruiz" . "jao@gnu.org"))
+ (:commit . "eddbc7ba70439881e4781fa73fb0fb240e02fd3b"))])
+ (context-coloring .
+ [(8 1 0)
+ ((emacs
+ (24 3)))
+ "Highlight by scope" tar
+ ((:url . "https://github.com/jacksonrayhamilton/context-coloring")
+ (:keywords "convenience" "faces" "tools")
+ (:maintainer "Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com")
+ (:authors
+ ("Jackson Ray Hamilton" . "jackson@jacksonrayhamilton.com"))
+ (:commit . "1b30a28857727202d1f6a027f83ad66151fb1e92"))])
+ (corfu .
+ [(2 0)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "COmpletion in Region FUnction" tar
+ ((:url . "https://github.com/minad/corfu")
+ (:keywords "abbrev" "convenience" "matching" "completion" "text")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:authors
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "061d926d0f0eb2633416deeddc403a1a67b062ae"))])
+ (coterm .
+ [(1 6)
+ ((emacs
+ (26 1))
+ (compat
+ (28 1 2 0)))
+ "Terminal emulation for comint" tar
+ ((:url . "https://repo.or.cz/emacs-coterm.git")
+ (:keywords "processes")
+ (:maintainer "jakanakaevangeli" . "jakanakaevangeli@chiru.no")
+ (:authors
+ ("jakanakaevangeli" . "jakanakaevangeli@chiru.no"))
+ (:commit . "d8e1b04cd359d9f27ab7c6dbf8cae90dde834085"))])
+ (counsel .
+ [(0 15 1)
+ ((emacs
+ (24 5))
+ (ivy
+ (0 15 1))
+ (swiper
+ (0 15 1)))
+ "Various completion functions using Ivy" tar
+ ((:url . "https://github.com/abo-abo/swiper")
+ (:keywords "convenience" "matching" "tools")
+ (:maintainer "Basil L. Contovounesios" . "basil@contovou.net")
+ (:authors
+ ("Oleh Krehel" . "ohwoeowho@gmail.com"))
+ (:commit . "72f47d4d1e6dcf89d59f5af65f365dd704efe9e5"))])
+ (cpio-mode .
+ [(0 17)
+ nil "Handle cpio archives in the style of dired." tar
+ ((:keywords "files")
+ (:maintainer "Douglas Lewan" . "d.lewan2000@gmail.com")
+ (:authors
+ ("Douglas Lewan" . "d.lewan2000@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/cpio-mode.html")
+ (:commit . "ce1183f52fa0cfc50145553804615e23d7d73046"))])
+ (cpupower .
+ [(1 0 5)
+ nil "cpupower command interface" tar
+ ((:url . "https://gitlab.com/steve-emacs-stuff/cpupower-el")
+ (:keywords "hardware" "cpupower" "cpu" "frequency-scaling")
+ (:maintainer "Stephen Meister" . "pallagun@gmail.com")
+ (:authors
+ ("Stephen Meister" . "pallagun@gmail.com"))
+ (:commit . "fa979dfafa1beb374bf42e937f0b5b99ed06222e"))])
+ (crdt .
+ [(0 3 5)
+ nil "Collaborative editing using Conflict-free Replicated Data Types" tar
+ ((:url . "https://code.librehq.com/qhong/crdt.el")
+ (:keywords "collaboration" "crdt")
+ (:maintainer "Qiantan Hong" . "qhong@alum.mit.edu")
+ (:authors
+ ("Qiantan Hong" . "qhong@alum.mit.edu"))
+ (:commit . "e6d42f42c5dedb73560048f4bf6263c63ffa21bb"))])
+ (crisp .
+ [(1 3 6)
+ nil "CRiSP/Brief Emacs emulator" tar
+ ((:keywords "emulations" "brief" "crisp")
+ (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com")
+ (:authors
+ ("Gary D. Foster" . "Gary.Foster@Corp.Sun.COM"))
+ (:url . "https://elpa.gnu.org/packages/crisp.html")
+ (:commit . "810f057c640043ca9e419248b73f43d82b1a47a0"))])
+ (csharp-mode .
+ [(2 0 0)
+ ((emacs
+ (26 1)))
+ "C# mode derived mode" tar
+ ((:url . "https://github.com/emacs-csharp/csharp-mode")
+ (:keywords "c#" "languages" "oop" "mode")
+ (:maintainer
+ ("Jostein Kjønigsen" . "jostein@gmail.com")
+ ("Theodor Thornhill" . "theo@thornhill.no"))
+ (:authors
+ ("Theodor Thornhill" . "theo@thornhill.no"))
+ (:commit . "02c61c219b2c22491eff9b7315fed661fab423d4"))])
+ (csv-mode .
+ [(1 27)
+ ((emacs
+ (27 1))
+ (cl-lib
+ (0 5)))
+ "Major mode for editing comma/char separated values" tar
+ ((:keywords "convenience")
+ (:maintainer nil . "emacs-devel@gnu.org")
+ (:authors
+ ("Francis J. Wright" . "F.J.Wright@qmul.ac.uk"))
+ (:url . "https://elpa.gnu.org/packages/csv-mode.html")
+ (:commit . "a16e9d8b0952de1badf6da8e652b178a7f6c4498"))])
+ (cursor-undo .
+ [(1 1 5)
+ nil "Undo Cursor Movement" tar
+ ((:keywords "undo" "cursor")
+ (:maintainer "Luke Lee" . "luke.yx.lee@gmail.com")
+ (:authors
+ ("Luke Lee" . "luke.yx.lee@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/cursor-undo.html")
+ (:commit . "e82084c3d491ff7199e14cc8da69c250b9bda492"))])
+ (cursory .
+ [(1 1 0)
+ ((emacs
+ (27 1)))
+ "Manage cursor styles using presets" tar
+ ((:url . "https://github.com/protesilaos/cursory")
+ (:keywords "convenience" "cursor")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "9c5bb8122d5780796b881da6d37442e532ba6c51"))])
+ (cycle-quotes .
+ [(0 1)
+ nil "Cycle between quote styles" tar
+ ((:keywords "convenience")
+ (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com")
+ (:authors
+ ("Simen Heggestøyl" . "simenheg@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/cycle-quotes.html")
+ (:commit . "836b19b39651419876e65cdb1a91e3eef83cc4e7"))])
+ (dape .
+ [(0 23 0)
+ ((emacs
+ (29 1))
+ (jsonrpc
+ (1 0 25)))
+ "Debug Adapter Protocol for Emacs" tar
+ ((:url . "https://github.com/svaante/dape")
+ (:maintainer "Daniel Pettersson" . "daniel@dpettersson.net")
+ (:commit . "4348c957986dbca5c1537b392a4220558ad8be3f"))])
+ (darkroom .
+ [(0 3)
+ ((cl-lib
+ (0 5)))
+ "Remove visual distractions and focus on writing" tar
+ ((:keywords "convenience" "emulations")
+ (:maintainer "João Távora" . "joaotavora@gmail.com")
+ (:authors
+ ("João Távora" . "joaotavora@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/darkroom.html")
+ (:commit . "4496945487130ae1123a9f17b40674ec24c54e8f"))])
+ (dash .
+ [(2 20 0)
+ ((emacs
+ (24)))
+ "A modern list library for Emacs" tar
+ ((:url . "https://github.com/magnars/dash.el")
+ (:keywords "extensions" "lisp")
+ (:maintainer "Basil L. Contovounesios" . "basil@contovou.net")
+ (:authors
+ ("Magnar Sveen" . "magnars@gmail.com"))
+ (:commit . "fcb5d831fc08a43f984242c7509870f30983c27c"))])
+ (dbus-codegen .
+ [(0 1)
+ ((cl-lib
+ (0 5)))
+ "Lisp code generation for D-Bus." tar
+ ((:keywords "comm" "dbus" "convenience")
+ (:maintainer nil . "emacs-devel@gnu.org")
+ (:authors
+ ("Daiki Ueno" . "ueno@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/dbus-codegen.html")
+ (:commit . "4b0d8525943ebba797e1ebaf97fd9a608aef5ec1"))])
+ (debbugs .
+ [(0 44)
+ ((emacs
+ (26 1))
+ (soap-client
+ (3 1 5)))
+ "SOAP library to access debbugs servers" tar
+ ((:keywords "comm" "hypermedia")
+ (:maintainer "Michael Albinus" . "michael.albinus@gmx.de")
+ (:authors
+ ("Michael Albinus" . "michael.albinus@gmx.de"))
+ (:url . "https://elpa.gnu.org/packages/debbugs.html")
+ (:commit . "4fde9fbcbd872b8c30f2e95c8c6513ae7578bdea"))])
+ (delight .
+ [(1 7)
+ ((cl-lib
+ (0 5))
+ (nadvice
+ (0 3)))
+ "A dimmer switch for your lighter text" tar
+ ((:url . "https://savannah.nongnu.org/projects/delight")
+ (:keywords "convenience")
+ (:maintainer "Phil Sainty" . "psainty@orcon.net.nz")
+ (:authors
+ ("Phil Sainty" . "psainty@orcon.net.nz"))
+ (:commit . "a763ec1e5c2987efea3ce2ee6d9c979f56ab6528"))])
+ (denote .
+ [(3 1 0)
+ ((emacs
+ (28 1)))
+ "Simple notes with an efficient file-naming scheme" tar
+ ((:url . "https://github.com/protesilaos/denote")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "3bb05f212cc29fa6953e6d703e5e0c2e982882a9"))])
+ (denote-journal .
+ [(0 0 0 1)
+ ((emacs
+ (28 1))
+ (denote
+ (3 1 0)))
+ "Convenience functions for daily journaling with Denote" tar
+ ((:url . "https://github.com/protesilaos/denote-journal")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "674c1b63f25986c703e962619f819e55e2bc1d09"))])
+ (denote-markdown .
+ [(0 0 0 1)
+ ((emacs
+ (28 1))
+ (denote
+ (3 1 0)))
+ "Extensions that better integrate Denote with Markdown" tar
+ ((:url . "https://github.com/protesilaos/denote-markdown")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "74c509aef815e18a3d9139afde7b013d9967fe93"))])
+ (denote-menu .
+ [(1 4 0)
+ ((emacs
+ (28 1))
+ (denote
+ (3 0 0)))
+ "View denote files in a tabulated list." tar
+ ((:url . "https://github.com/namilus/denote-menu")
+ (:maintainer "Mohamed Suliman" . "sulimanm@tcd.ie")
+ (:authors
+ ("Mohamed Suliman" . "sulimanm@tcd.ie"))
+ (:commit . "247a9b66d67b3fe409eda8f896feae87546f5b4d"))])
+ (denote-org .
+ [(0 0 0 1)
+ ((emacs
+ (28 1))
+ (denote
+ (3 1 0)))
+ "Denote extensions for Org mode" tar
+ ((:url . "https://github.com/protesilaos/denote-org")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "0aefda419e38622e69b4f3b42c0e5b69c1f3d2a1"))])
+ (denote-search .
+ [(1 0 3)
+ ((emacs
+ (29 1))
+ (denote
+ (3 0)))
+ "Search the contents of your notes" tar
+ ((:url . "https://github.com/lmq-10/denote-search")
+ (:keywords "matching")
+ (:maintainer "Lucas Quintana" . "lmq10@protonmail.com")
+ (:authors
+ ("Lucas Quintana" . "lmq10@protonmail.com"))
+ (:commit . "4df3e77a495b4f0df7fe56924509afe7f2fa735d"))])
+ (denote-sequence .
+ [(0 0 0 1)
+ ((emacs
+ (28 1))
+ (denote
+ (3 1 0)))
+ "Sequence notes or Folgezettel with Denote" tar
+ ((:url . "https://github.com/protesilaos/denote-sequence")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "22c0af06e7dba199163a83b431505bd87d99294d"))])
+ (denote-silo .
+ [(0 0 0 1)
+ ((emacs
+ (28 1))
+ (denote
+ (3 1 0)))
+ "Convenience functions for using Denote in multiple silos" tar
+ ((:url . "https://github.com/protesilaos/denote-silo")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "1d49f7613ef62c514f1719e9f1c1b78a8928042e"))])
+ (detached .
+ [(0 10 1)
+ ((emacs
+ (27 1)))
+ "A package to launch, and manage, detached processes" tar
+ ((:url . "https://sr.ht/~niklaseklund/detached.el/")
+ (:keywords "convenience" "processes")
+ (:maintainer "detached.el Development" . "~niklaseklund/detached.el@lists.sr.ht")
+ (:authors
+ ("Niklas Eklund" . "niklas.eklund@posteo.net"))
+ (:commit . "fedb0df5b0fbba13c662107855fb07a922793096"))])
+ (devdocs .
+ [(0 6 1)
+ ((emacs
+ (27 1)))
+ "Emacs viewer for DevDocs" tar
+ ((:url . "https://github.com/astoff/devdocs.el")
+ (:keywords "help")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "ebdd3b39bef1a928c069373337d0f8e4f2d8b8d2"))])
+ (devicetree-ts-mode .
+ [(0 3)
+ ((emacs
+ (29 1)))
+ "Tree-sitter support for DTS" tar
+ ((:url . "https://sr.ht/~akagi/devicetree-ts-mode")
+ (:keywords "languages" "devicetree" "tree-sitter")
+ (:maintainer "Aleksandr Vityazev" . "avityazew@gmail.com")
+ (:authors
+ ("Aleksandr Vityazev" . "avityazew@gmail.com"))
+ (:commit . "bc07c1124545cbf6e5ebe64e92bfaa306e309033"))])
+ (dicom .
+ [(0 5)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "DICOM viewer - Digital Imaging & Communications in Medicine" tar
+ ((:url . "https://github.com/minad/dicom")
+ (:keywords "multimedia" "hypermedia" "files")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:authors
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "54440a704c573cd91b663ac79a01264a1aa59c51"))])
+ (dict-tree .
+ [(0 17)
+ ((trie
+ (0 6))
+ (tNFA
+ (0 1 1))
+ (heap
+ (0 3))
+ (emacs
+ (24 1)))
+ "Dictionary data structure" tar
+ ((:url . "http://www.dr-qubit.org/emacs.php")
+ (:keywords "extensions" "matching" "data structures trie" "tree" "dictionary" "completion" "regexp")
+ (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
+ (:authors
+ ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
+ (:commit . "a83ea986982b2d09d150456028a9f1e73658333a"))])
+ (diff-hl .
+ [(1 10 0)
+ ((cl-lib
+ (0 2))
+ (emacs
+ (25 1)))
+ "Highlight uncommitted changes using VC" tar
+ ((:url . "https://github.com/dgutov/diff-hl")
+ (:keywords "vc" "diff")
+ (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev")
+ (:authors
+ ("Dmitry Gutov" . "dmitry@gutov.dev"))
+ (:commit . "b80ff9b4a772f7ea000e86fbf88175104ddf9557"))])
+ (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"))])
+ (diminish .
+ [(0 46)
+ ((emacs
+ (24 3)))
+ "Diminished modes are minor modes with no modeline display" tar
+ ((:url . "https://github.com/myrjola/diminish.el")
+ (:keywords "extensions" "diminish" "minor" "codeprose")
+ (:maintainer "Martin Yrjölä" . "martin.yrjola@gmail.com")
+ (:authors
+ ("Will Mengarini" . "seldon@eskimo.com"))
+ (:commit . "66b3902401059d161424b1b8d0abc3cb0a7d6df0"))])
+ (dired-du .
+ [(0 5 2)
+ ((emacs
+ (24 4))
+ (cl-lib
+ (0 5)))
+ "Dired with recursive directory sizes" tar
+ ((:keywords "files" "unix" "convenience")
+ (:maintainer "Tino Calancha" . "tino.calancha@gmail.com")
+ (:authors
+ ("Tino Calancha" . "tino.calancha@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/dired-du.html")
+ (:commit . "c586a6bc255cec88e1027e70319030cb63ecdc4a"))])
+ (dired-duplicates .
+ [(0 4)
+ ((emacs
+ (27 1)))
+ "Find duplicate files locally and remotely" tar
+ ((:url . "https://codeberg.org/hjudt/dired-duplicates")
+ (:keywords "files")
+ (:maintainer "Harald Judt" . "h.judt@gmx.at")
+ (:authors
+ ("Harald Judt" . "h.judt@gmx.at"))
+ (:commit . "5c5f24bea92159987f65f01ef32b261e905997bd"))])
+ (dired-git-info .
+ [(0 3 1)
+ ((emacs
+ (25)))
+ "Show git info in dired" tar
+ ((:url . "https://github.com/clemera/dired-git-info")
+ (:keywords "dired" "files")
+ (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
+ (:authors
+ ("Clemens Radermacher" . "clemera@posteo.net"))
+ (:commit . "bd8556eef10e57b175406c117f18e1953422c803"))])
+ (dired-preview .
+ [(0 4 0)
+ ((emacs
+ (28 1)))
+ "Automatically preview file at point in Dired" tar
+ ((:url . "https://github.com/protesilaos/dired-preview")
+ (:keywords "files" "convenience")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "6caf3b15802ddcbbb89ee7278e714c3158f76d83"))])
+ (disk-usage .
+ [(1 3 3)
+ ((emacs
+ (26 1)))
+ "Sort and browse disk usage listings" tar
+ ((:url . "https://gitlab.com/Ambrevar/emacs-disk-usage")
+ (:keywords "files" "convenience" "tools")
+ (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz")
+ (:authors
+ ("Pierre Neidhardt" . "mail@ambrevar.xyz"))
+ (:commit . "b0fb8af34291a49b041eab8b5570e7bc8433a8d8"))])
+ (dismal .
+ [(1 5 2)
+ ((cl-lib
+ (0)))
+ "Dis Mode Ain't Lotus: Spreadsheet program Emacs" tar
+ ((:maintainer "UnMaintainer" . "emacs-devel@gnu.org")
+ (:authors
+ (nil . "fox@cs.nyu.edu")
+ (nil . "ritter@cs.cmu.edu"))
+ (:url . "https://elpa.gnu.org/packages/dismal.html")
+ (:commit . "670c0001026ff437d14545aeed3ef5745f0a53d2"))])
+ (djvu .
+ [(1 1 2)
+ nil "Edit and view Djvu files via djvused" tar
+ ((:keywords "files" "wp")
+ (:maintainer "Roland Winkler" . "winkler@gnu.org")
+ (:authors
+ ("Roland Winkler" . "winkler@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/djvu.html")
+ (:commit . "071c8ab168588897475899c46eaa16e70141db8c"))])
+ (do-at-point .
+ [(0 1 2)
+ ((emacs
+ (26 1)))
+ "Generic context-sensitive action dispatcher." tar
+ ((:url . "https://git.sr.ht/~pkal/do-at-point")
+ (:keywords "convenience")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "da0742df74cbb36347aefd5dcb17d674ee4846d3"))])
+ (doc-toc .
+ [(1 2)
+ ((emacs
+ (26 1)))
+ "Manage outlines/table of contents of pdf and djvu documents" tar
+ ((:url . "https://github.com/dalanicolai/doc-tools-toc")
+ (:keywords "tools" "outlines" "convenience")
+ (:maintainer "Daniel Laurens Nicolai" . "dalanicolai@gmail.com")
+ (:authors
+ ("Daniel Laurens Nicolai" . "dalanicolai@gmail.com"))
+ (:commit . "4a179fbacd7bc9efbd6cfcdc8772d42935e6de29"))])
+ (docbook .
+ [(0 1)
+ nil "Info-like viewer for DocBook" tar
+ ((:keywords "docs" "help")
+ (:maintainer "Chong Yidong" . "cyd@gnu.org")
+ (:authors
+ ("Chong Yidong" . "cyd@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/docbook.html")
+ (:commit . "a59f87c0dc04bcfcf9f55a124658c2e7a585dbd2"))])
+ (drepl .
+ [(0 3)
+ ((emacs
+ (29 1))
+ (comint-mime
+ (0 3)))
+ "REPL protocol for the dumb terminal" tar
+ ((:url . "https://github.com/astoff/drepl")
+ (:keywords "languages" "processes")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "07c4503763b5880f163b417194d580677f37a819"))])
+ (dts-mode .
+ [(1 0)
+ ((emacs
+ (24)))
+ "Major mode for Device Tree source files" tar
+ ((:keywords "languages")
+ (:maintainer "Ben Gamari" . "ben@smart-cactus.org")
+ (:authors
+ ("Ben Gamari" . "ben@smart-cactus.org"))
+ (:url . "https://elpa.gnu.org/packages/dts-mode.html")
+ (:commit . "8413d2dc9b3347831aa9e8c8b2524af3ef005441"))])
+ (easy-escape .
+ [(0 2 1)
+ nil "Improve readability of escape characters in regular expressions" tar
+ ((:url . "https://github.com/cpitclaudel/easy-escape")
+ (:keywords "convenience" "lisp" "tools")
+ (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com")
+ (:authors
+ ("Clément Pit-Claudel" . "clement.pitclaudel@live.com"))
+ (:commit . "938497a21e65ba6b3ff8ec90e93a6d0ab18dc9b4"))])
+ (easy-kill .
+ [(0 9 5)
+ ((emacs
+ (25))
+ (cl-lib
+ (0 5)))
+ "kill & mark things easily" tar
+ ((:url . "https://github.com/leoliu/easy-kill")
+ (:keywords "killing" "convenience")
+ (:maintainer "Leo Liu" . "sdl.web@gmail.com")
+ (:authors
+ ("Leo Liu" . "sdl.web@gmail.com"))
+ (:commit . "f155d19c528e27f8f6c72f0d75f652edbdcab37f"))])
+ (ebdb .
+ [(0 8 22)
+ ((emacs
+ (25 1))
+ (seq
+ (2 15)))
+ "Contact management package" tar
+ ((:url . "https://github.com/girzel/ebdb")
+ (:keywords "convenience" "mail")
+ (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
+ (:authors
+ ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
+ (:commit . "b96e5470c54503eab2159e69c822648ad55e6915"))])
+ (ebdb-gnorb .
+ [(1 0 2)
+ ((gnorb
+ (1 1 0))
+ (ebdb
+ (0 2)))
+ "Utilities for connecting EBDB to Gnorb" tar
+ ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
+ (:authors
+ ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
+ (:url . "https://elpa.gnu.org/packages/ebdb-gnorb.html")
+ (:commit . "461a6b35dc9322d1ec59547ad845d26a6c65a698"))])
+ (ebdb-i18n-chn .
+ [(1 3 2)
+ ((pyim
+ (1 6 0))
+ (ebdb
+ (0 6 17)))
+ "China-specific internationalization support for EBDB" tar
+ ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
+ (:authors
+ ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
+ (:url . "https://elpa.gnu.org/packages/ebdb-i18n-chn.html")
+ (:commit . "b8c1f7c21204bda9c130ce21a75d69358d1bc49a"))])
+ (ediprolog .
+ [(2 3)
+ nil "Emacs Does Interactive Prolog" tar
+ ((:url . "https://www.metalevel.at/ediprolog/")
+ (:keywords "languages" "processes")
+ (:maintainer "Markus Triska" . "triska@metalevel.at")
+ (:authors
+ ("Markus Triska" . "triska@metalevel.at"))
+ (:commit . "ea8710335eec483b576c7a800c92b8fd214aa6dd"))])
+ (eev .
+ [(20250216)
+ ((emacs
+ (25 1)))
+ "Support for e-scripts (eepitch blocks, elisp hyperlinks, etc)" tar
+ ((:url . "http://anggtwu.net/#eev")
+ (:keywords "lisp" "e-scripts")
+ (:maintainer "Eduardo Ochs" . "eduardoochs@gmail.com")
+ (:authors
+ ("Eduardo Ochs" . "eduardoochs@gmail.com"))
+ (:commit . "5c3013b291a17a5e8ec11e6a5d18e5b3b5aa0b17"))])
+ (ef-themes .
+ [(1 9 0)
+ ((emacs
+ (27 1)))
+ "Colorful and legible themes" tar
+ ((:url . "https://github.com/protesilaos/ef-themes")
+ (:keywords "faces" "theme" "accessibility")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "b1333b703805a21ed6414386830cb5d1977475b7"))])
+ (eglot .
+ [(1 18)
+ ((emacs
+ (26 3))
+ (compat
+ (27 1))
+ (eldoc
+ (1 14 0))
+ (external-completion
+ (0 1))
+ (flymake
+ (1 2 1))
+ (jsonrpc
+ (1 0 24))
+ (project
+ (0 9 8))
+ (seq
+ (2 23))
+ (track-changes
+ (1 2))
+ (xref
+ (1 6 2)))
+ "The Emacs Client for LSP servers" tar
+ ((:url . "https://github.com/joaotavora/eglot")
+ (:keywords "convenience" "languages")
+ (:maintainer "João Távora" . "joaotavora@gmail.com")
+ (:authors
+ ("João Távora" . "joaotavora@gmail.com"))
+ (:commit . "49f449bb5bc90bc1eca6b4a1f013d4c0b5460d65"))])
+ (el-job .
+ [(2 4 3)
+ ((emacs
+ (29 1)))
+ "Contrived way to call a function using all CPU cores" tar
+ ((:url . "https://github.com/meedstrom/el-job")
+ (:keywords "processes")
+ (:maintainer "Martin Edström" . "meedstrom@runbox.eu")
+ (:authors
+ ("Martin Edström" . "meedstrom@runbox.eu"))
+ (:commit . "b80bc0380edca448b1e856441659d8eb4d97a3f7"))])
+ (el-search .
+ [(1 12 6 1)
+ ((emacs
+ (25))
+ (stream
+ (2 2 4))
+ (cl-print
+ (1 0)))
+ "Expression based interactive search for Emacs Lisp" tar
+ ((:keywords "lisp")
+ (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de")
+ (:authors
+ ("Michael Heerdegen" . "michael_heerdegen@web.de"))
+ (:url . "https://elpa.gnu.org/packages/el-search.html")
+ (:commit . "43779b910025aba2574213cf3eabee2132c0a175"))])
+ (eldoc .
+ [(1 15 0)
+ ((emacs
+ (26 3)))
+ "Show function arglist or variable docstring in echo area" tar
+ ((:keywords "extensions")
+ (:maintainer "Noah Friedman" . "friedman@splode.com")
+ (:authors
+ ("Noah Friedman" . "friedman@splode.com"))
+ (:url . "https://elpa.gnu.org/packages/eldoc.html")
+ (:commit . "dc744fe6f3cd185bd9d29f61b08cd4c524e3969e"))])
+ (electric-spacing .
+ [(5 0)
+ nil "Insert operators with surrounding spaces smartly" tar
+ ((:maintainer "William Xu" . "william.xwl@gmail.com")
+ (:authors
+ ("William Xu" . "william.xwl@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/electric-spacing.html")
+ (:commit . "122ac5d08c3d3d91251752136abab9721d90e36c"))])
+ (elisa .
+ [(1 1 7)
+ ((emacs
+ (29 2))
+ (ellama
+ (0 11 2))
+ (llm
+ (0 18 1))
+ (async
+ (1 9 8))
+ (plz
+ (0 9)))
+ "Emacs Lisp Information System Assistant" tar
+ ((:url . "http://github.com/s-kostyaev/elisa")
+ (:keywords "help" "local" "tools")
+ (:maintainer "Sergey Kostyaev" . "sskostyaev@gmail.com")
+ (:authors
+ ("Sergey Kostyaev" . "sskostyaev@gmail.com"))
+ (:commit . "b655b59d371639d357dcabe48f1c2cd1694ee8de"))])
+ (elisp-benchmarks .
+ [(1 16)
+ nil "elisp benchmarks collection" tar
+ ((:keywords "languages" "lisp")
+ (:maintainer "Andrea Corallo" . "acorallo@gnu.org")
+ (:authors
+ ("Andrea Corallo" . "acorallo@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/elisp-benchmarks.html")
+ (:commit . "1a3d97954957a95a179806e0d49ca6d178b097af"))])
+ (ellama .
+ [(1 7 2)
+ ((emacs
+ (28 1))
+ (llm
+ (0 24 0))
+ (plz
+ (0 8))
+ (transient
+ (0 7))
+ (compat
+ (29 1)))
+ "Tool for interacting with LLMs" tar
+ ((:url . "http://github.com/s-kostyaev/ellama")
+ (:keywords "help" "local" "tools")
+ (:maintainer "Sergey Kostyaev" . "sskostyaev@gmail.com")
+ (:authors
+ ("Sergey Kostyaev" . "sskostyaev@gmail.com"))
+ (:commit . "213da10f885dcb2f040245276ca8b9f755c0f1a8"))])
+ (emacs-gc-stats .
+ [(1 4 2)
+ ((emacs
+ (25 1)))
+ "Collect Emacs GC statistics" tar
+ ((:url . "https://git.sr.ht/~yantar92/emacs-gc-stats")
+ (:maintainer "Ihor Radchenko" . "yantar92@posteo.net")
+ (:authors
+ ("Ihor Radchenko" . "yantar92@posteo.net"))
+ (:commit . "05d669e123f411c9582f99a9a6182efa43d01a6b"))])
+ (embark .
+ [(1 1)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1 4 0)))
+ "Conveniently act on minibuffer completions" tar
+ ((:url . "https://github.com/oantolin/embark")
+ (:keywords "convenience")
+ (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx")
+ (:authors
+ ("Omar Antolín Camarena" . "omar@matem.unam.mx"))
+ (:commit . "195add1f1ccd1059472c9df7334c97c4d155425e"))])
+ (embark-consult .
+ [(1 1)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1 4 0))
+ (embark
+ (1 0))
+ (consult
+ (1 0)))
+ "Consult integration for Embark" tar
+ ((:url . "https://github.com/oantolin/embark")
+ (:keywords "convenience")
+ (:maintainer "Omar Antolín Camarena" . "omar@matem.unam.mx")
+ (:authors
+ ("Omar Antolín Camarena" . "omar@matem.unam.mx"))
+ (:commit . "195add1f1ccd1059472c9df7334c97c4d155425e"))])
+ (ement .
+ [(0 16)
+ ((emacs
+ (27 1))
+ (map
+ (2 1))
+ (persist
+ (0 5))
+ (plz
+ (0 6))
+ (taxy
+ (0 10))
+ (taxy-magit-section
+ (0 13))
+ (svg-lib
+ (0 2 5))
+ (transient
+ (0 3 7)))
+ "Matrix client" tar
+ ((:url . "https://github.com/alphapapa/ement.el")
+ (:keywords "comm")
+ (:maintainer "Adam Porter" . "adam@alphapapa.net")
+ (:authors
+ ("Adam Porter" . "adam@alphapapa.net"))
+ (:commit . "26bf5a4efd08bc724cf29c412c36c2909d72bb13"))])
+ (emms .
+ [(22)
+ ((cl-lib
+ (0 5))
+ (nadvice
+ (0 3))
+ (seq
+ (0)))
+ "The Emacs Multimedia System" tar
+ ((:url . "https://www.gnu.org/software/emms/")
+ (:keywords "emms" "mp3" "ogg" "flac" "music" "mpeg" "video" "multimedia")
+ (:maintainer "Yoni Rabkin" . "yrk@gnu.org")
+ (:authors
+ ("Jorgen Schäfer" . "forcer@forcix.cx"))
+ (:commit . "338462506d7de508f7f74a01d15753f9113cd3cb"))])
+ (engrave-faces .
+ [(0 3 1)
+ ((emacs
+ (27 1)))
+ "Convert font-lock faces to other formats" tar
+ ((:url . "https://github.com/tecosaur/engrave-faces")
+ (:keywords "faces")
+ (:maintainer "TEC" . "tec@tecosaur.com")
+ (:authors
+ ("TEC" . "https://github/tecosaur"))
+ (:commit . "fe29d9b593a0f7ada4df3f52dfb9f7f8c1bdaaa7"))])
+ (enwc .
+ [(2 0)
+ ((emacs
+ (25 1)))
+ "The Emacs Network Client" tar
+ ((:url . "https://savannah.nongnu.org/p/enwc")
+ (:keywords "external" "network" "wicd" "manager" "nm")
+ (:maintainer "Ian Dunn" . "dunni@gnu.org")
+ (:authors
+ ("Ian Dunn" . "dunni@gnu.org"))
+ (:commit . "9893d7f17a2ee7f83587c305c256bd1300995125"))])
+ (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"))])
+ (erc .
+ [(5 6)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1 4 5)))
+ "An Emacs Internet Relay Chat client" tar
+ ((:url . "https://www.gnu.org/software/emacs/erc.html")
+ (:keywords "irc" "chat" "client" "internet")
+ (:maintainer
+ ("Amin Bandali" . "bandali@gnu.org")
+ ("F. Jason Park" . "jp@neverwas.me"))
+ (:authors
+ ("Alexander L. Belikoff" . "alexander@belikoff.net"))
+ (:commit . "d1e98a8f0128747030e97ffea20a8f67aa0cd923"))])
+ (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")
+ (:keywords "convenience")
+ (: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"))
+ (:commit . "ac70b2563fb6e3d69ea382fddc87b5721c20c292"))])
+ (ess .
+ [(25 1 0)
+ ((emacs
+ (25 1)))
+ "Emacs Speaks Statistics" tar
+ ((:url . "https://ess.r-project.org/")
+ (:maintainer "ESS Core Team" . "ESS-core@r-project.org")
+ (: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"))
+ (:commit . "78f4db2879d00e21b71261f0a6e512504837ab9b"))])
+ (excorporate .
+ [(1 1 2)
+ ((emacs
+ (24 1))
+ (cl-lib
+ (0 6 1))
+ (fsm
+ (0 2 1))
+ (soap-client
+ (3 2 0))
+ (url-http-ntlm
+ (2 0 4))
+ (nadvice
+ (0 3))
+ (url-http-oauth
+ (0 8 3)))
+ "Exchange Web Services (EWS) integration" tar
+ ((:url . "https://www.fitzsim.org/blog/")
+ (:keywords "calendar")
+ (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
+ (:authors
+ ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))
+ (:commit . "8d1167ac47aa88265546ee7a82fd49ff6f9c8d66"))])
+ (expand-region .
+ [(1 0 0)
+ ((emacs
+ (24 4)))
+ "Increase selected region by semantic units." tar
+ ((:url . "https://github.com/magnars/expand-region.el")
+ (:keywords "marking" "region")
+ (:maintainer "Magnar Sveen" . "magnars@gmail.com")
+ (:authors
+ ("Magnar Sveen" . "magnars@gmail.com"))
+ (:commit . "9e3f86c02c5e2ab6f0d95da8a34045b54f6166d1"))])
+ (expreg .
+ [(1 3 1)
+ ((emacs
+ (29 1)))
+ "Simple expand region" tar
+ ((:url . "https://github.com/casouri/expreg")
+ (:keywords "text" "editing")
+ (:maintainer "Yuan Fu" . "casouri@gmail.com")
+ (:authors
+ ("Yuan Fu" . "casouri@gmail.com"))
+ (:commit . "9950c07ec90293964baa33603f4a80e764b0a847"))])
+ (external-completion .
+ [(0 1)
+ nil "Let external tools control completion style" tar
+ ((:maintainer "João Távora" . "joaotavora@gmail.com")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/external-completion.html")
+ (:commit . "4bc9c8972ac0a3dfa237a9c5704de89ef24ad82b"))])
+ (exwm .
+ [(0 33)
+ ((emacs
+ (27 1))
+ (xelb
+ (0 20))
+ (compat
+ (30)))
+ "Emacs X Window Manager" tar
+ ((:url . "https://github.com/emacs-exwm/exwm")
+ (:keywords "unix")
+ (:maintainer
+ ("Adrián Medraño Calvo" . "adrian@medranocalvo.com")
+ ("Steven Allen" . "steven@stebalien.com")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:authors
+ ("Chris Feng" . "chris.w.feng@gmail.com"))
+ (:commit . "da034e67784a9e2600383e75606a6ade6925f374"))])
+ (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/"))])
+ (face-shift .
+ [(0 2 1)
+ ((emacs
+ (24 1)))
+ "Shift the colour of certain faces" tar
+ ((:url . "https://git.sr.ht/~pkal/face-shift")
+ (:keywords "faces")
+ (:maintainer "Philip Kaludercic" . "philipk@posteo.net")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "671e53fdef9ed3fdb9ee768216d05b90e3ce592a"))])
+ (filechooser .
+ [(0 2 1)
+ ((emacs
+ (28 1))
+ (compat
+ (29 1)))
+ "An xdg-desktop-portal filechooser" tar
+ ((:url . "https://codeberg.org/rahguzar/filechooser")
+ (:keywords "convenience" "files" "tools" "unix")
+ (:maintainer "rahguzar" . "rahguzar@zohomail.eu")
+ (:authors
+ ("rahguzar" . "rahguzar@zohomail.eu"))
+ (:commit . "62a9ef588331b06c818ea5db5a73e756f20fd13d"))])
+ (filladapt .
+ [(2 12 2)
+ ((emacs
+ (24 4)))
+ "Adaptive fill" tar
+ ((:maintainer nil . "emacs-devel@gnu.org")
+ (:authors
+ ("Kyle E. Jones" . "kyle_jones@wonderworks.com"))
+ (:url . "https://elpa.gnu.org/packages/filladapt.html")
+ (:commit . "6cce6acc6350541efe6b1064335b480e820fd325"))])
+ (firefox-javascript-repl .
+ [(0 9 5)
+ ((emacs
+ (26 1)))
+ "Jack into Firefox" tar
+ ((:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
+ (:authors
+ ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))
+ (:url . "https://elpa.gnu.org/packages/firefox-javascript-repl.html")
+ (:commit . "fee99c20f1f4684ed845eeac9eda46fcde6bf1e9"))])
+ (flylisp .
+ [(0 2)
+ nil "Color unbalanced parentheses and parentheses inconsistent with indentation" tar
+ ((:maintainer "Barry O'Reilly" . "gundaetiapo@gmail.com")
+ (:authors
+ ("Barry O'Reilly" . "gundaetiapo@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/flylisp.html")
+ (:commit . "20fe3e77bb73773c8678e65ae38020b0b7f996eb"))])
+ (flymake .
+ [(1 3 7)
+ ((emacs
+ (26 1))
+ (eldoc
+ (1 14 0))
+ (project
+ (0 7 1)))
+ "A universal on-the-fly syntax checker" tar
+ ((:keywords "c" "languages" "tools")
+ (:maintainer "João Távora" . "joaotavora@gmail.com")
+ (:authors
+ ("Pavel Kobyakov" . "pk_at_work@yahoo.com"))
+ (:url . "https://elpa.gnu.org/packages/flymake.html")
+ (:commit . "309823ff7796416414cee8c6f4d2650615c19f64"))])
+ (flymake-clippy .
+ [(1 1 0)
+ ((emacs
+ (27)))
+ "Flymake backend for Clippy" tar
+ ((:url . "https://github.com/mak-kirkland/flymake-clippy")
+ (:keywords "languages" "tools")
+ (:maintainer "Michael Kirkland" . "mak.kirkland@proton.me")
+ (:authors
+ ("Michael Kirkland" . "mak.kirkland@proton.me"))
+ (:commit . "38aeda6a8f4090b00f3c7fdb5188f80e04c556de"))])
+ (flymake-codespell .
+ [(0 1)
+ ((emacs
+ (26 1))
+ (compat
+ (29 1 4 2)))
+ "Flymake backend for codespell" tar
+ ((:url . "https://www.github.com/skangas/flymake-codespell")
+ (:keywords "extensions")
+ (:maintainer "Stefan Kangas" . "stefankangas@gmail.com")
+ (:authors
+ ("Stefan Kangas" . "stefankangas@gmail.com"))
+ (:commit . "d72e3ad4cdfd5cea1509a241d55e18f54ae2aeca"))])
+ (flymake-proselint .
+ [(0 3 0)
+ ((emacs
+ (26 1)))
+ "Flymake backend for proselint" tar
+ ((:url . "https://git.sr.ht/~manuel-uberti/flycheck-proselint")
+ (:keywords "convenience")
+ (:maintainer "Manuel Uberti" . "~manuel-uberti/flymake-proselint@lists.sr.ht")
+ (:authors
+ ("Manuel Uberti" . "manuel.uberti@inventati.org"))
+ (:commit . "9c68ee881f18f554f0ab5bbf5bee1a4b753d792b"))])
+ (fontaine .
+ [(3 0 0)
+ ((emacs
+ (29 1)))
+ "Set font configurations using presets" tar
+ ((:url . "https://github.com/protesilaos/fontaine")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "fe78a2be64b09f55748fa0c6e62d59e787b761b4"))])
+ (frame-tabs .
+ [(1 1)
+ nil "show buffer tabs in side window" tar
+ ((:keywords "frames" "tabs")
+ (:maintainer "Martin Rudalics" . "rudalics@gmx.at")
+ (:authors
+ ("Martin Rudalics" . "rudalics@gmx.at"))
+ (:url . "https://elpa.gnu.org/packages/frame-tabs.html")
+ (:commit . "2142034967085642823f7f60f9a3e4f09ada089e"))])
+ (frog-menu .
+ [(0 2 11)
+ ((emacs
+ (26))
+ (avy
+ (0 4))
+ (posframe
+ (0 4)))
+ "Quickly pick items from ad hoc menus" tar
+ ((:url . "https://github.com/clemera/frog-menu")
+ (:keywords "convenience")
+ (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
+ (:authors
+ ("Clemens Radermacher" . "clemera@posteo.net"))
+ (:commit . "3d99c10eb472b5f7fe761bb3f329fe10971ea903"))])
+ (fsm .
+ [(0 2 1)
+ ((emacs
+ (24 1))
+ (cl-lib
+ (0 5)))
+ "state machine library" tar
+ ((:keywords "extensions")
+ (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
+ (:authors
+ ("Magnus Henoch" . "magnus.henoch@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/fsm.html")
+ (:commit . "3acbc4df9b13d234ca1e297d85be27c54e81799e"))])
+ (ftable .
+ [(1 1)
+ ((emacs
+ (26 0)))
+ "Fill a table to fit in n columns" tar
+ ((:url . "https://github.com/casouri/ftable")
+ (:keywords "convenience" "text" "table")
+ (:maintainer "Yuan Fu" . "casouri@gmail.com")
+ (:authors
+ ("Yuan Fu" . "casouri@gmail.com"))
+ (:commit . "d7c243ac3be2a67986f53f3dc31ba1426e82b771"))])
+ (gcmh .
+ [(0 2 1)
+ ((emacs
+ (24)))
+ "the Garbage Collector Magic Hack" tar
+ ((:url . "https://gitlab.com/koral/gcmh")
+ (:keywords "internal")
+ (:maintainer nil . "akrl@sdf.org")
+ (:authors
+ ("Andrea Corallo" . "akrl@sdf.org"))
+ (:commit . "0089f9c3a6d4e9a310d0791cf6fa8f35642ecfd9"))])
+ (ggtags .
+ [(0 9 0)
+ ((emacs
+ (25)))
+ "emacs frontend to GNU Global source code tagging system" tar
+ ((:url . "https://github.com/leoliu/ggtags")
+ (:keywords "tools" "convenience")
+ (:maintainer "Leo Liu" . "sdl.web@gmail.com")
+ (:authors
+ ("Leo Liu" . "sdl.web@gmail.com"))
+ (:commit . "a0809f5241d9accceb161ca40374680799021f04"))])
+ (gited .
+ [(0 6 0)
+ ((emacs
+ (24 4))
+ (cl-lib
+ (0 5)))
+ "Operate on Git branches like dired" tar
+ ((:keywords "git" "vc" "convenience")
+ (:maintainer "Tino Calancha" . "tino.calancha@gmail.com")
+ (:authors
+ ("Tino Calancha" . "tino.calancha@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/gited.html")
+ (:commit . "475e29723ad2d5ff08cae5fdaa122ab56e69141b"))])
+ (gle-mode .
+ [(1 1)
+ ((cl-lib
+ (0 5)))
+ "Major mode to edit Graphics Layout Engine files" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/gle-mode.html")
+ (:commit . "b633a627bb15f77f7e64df89f82b8f556dcc0a6e"))])
+ (gnat-compiler .
+ [(1 0 3)
+ ((emacs
+ (25 3))
+ (wisi
+ (4 3 0)))
+ "Support for running GNAT tools" tar
+ ((:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@member.fsf.org"))
+ (:url . "https://elpa.gnu.org/packages/gnat-compiler.html")
+ (:commit . "9db5c393ee0f9694e83305ef8b0b1e37f0560111"))])
+ (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"))])
+ (gnome-dark-style .
+ [(0 2 3)
+ ((emacs
+ (30 1)))
+ "Sync theme with GNOME color-scheme" tar
+ ((:url . "https://github.com/dimagid/gnome-dark-style")
+ (:keywords "themes" "gnome" "sync" "dark" "light" "color-scheme")
+ (:maintainer "David Dimagid" . "davidimagid@gmail.com")
+ (:authors
+ ("David Dimagid" . "davidimagid@gmail.com"))
+ (:commit . "a2e9248ea09776c13966d8181d3f2078e9a1c7ba"))])
+ (gnorb .
+ [(1 6 11)
+ ((cl-lib
+ (0 5)))
+ "Glue code between Gnus, Org, and BBDB" tar
+ ((:keywords "mail" "org" "gnus" "bbdb" "todo" "task")
+ (:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
+ (:authors
+ ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
+ (:url . "https://elpa.gnu.org/packages/gnorb.html")
+ (:commit . "409e4fc2c83f8406f362028dbcc3a1fc21182819"))])
+ (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 . "https://elpa.gnu.org/packages/gnu-elpa.html")
+ (:commit . "cd18964ec3176ab99d626da4ca6ca7d4bf2389db"))])
+ (gnu-elpa-keyring-update .
+ [(2022 12 1)
+ nil "Update Emacs's GPG keyring for GNU ELPA" tar
+ ((:keywords "maint" "tools")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/gnu-elpa-keyring-update.html")
+ (:commit . "1e8726c459258fba62ee38807abdae4e350e5238"))])
+ (gnugo .
+ [(3 1 2)
+ ((ascii-art-to-unicode
+ (1 5))
+ (xpm
+ (1 0 1))
+ (cl-lib
+ (0 5)))
+ "play GNU Go in a buffer" tar
+ ((:url . "https://www.gnuvola.org/software/gnugo/")
+ (:keywords "games" "processes")
+ (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org")
+ (:authors
+ ("Thien-Thi Nguyen" . "ttn@gnu.org"))
+ (:commit . "1fd2e8df042f8e51a87173ce36220ee9a8c4241c"))])
+ (gnus-mock .
+ [(0 5)
+ nil "Mock Gnus installation for testing" tar
+ ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
+ (:authors
+ ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
+ (:url . "https://elpa.gnu.org/packages/gnus-mock.html")
+ (:commit . "0ec119ff8ddca61fc0f3e05ac4e895d57cb2ca21"))])
+ (gpastel .
+ [(0 5 0)
+ ((emacs
+ (25 1)))
+ "Integrates GPaste with the kill-ring" tar
+ ((:url . "https://gitlab.petton.fr/DamienCassou/desktop-environment")
+ (:keywords "tools")
+ (:maintainer "Damien Cassou" . "damien@cassou.me")
+ (:authors
+ ("Damien Cassou" . "damien@cassou.me"))
+ (:commit . "8a5522b274f79d55d7c9a0b2aaf062526f9253c7"))])
+ (gpr-mode .
+ [(1 0 5)
+ ((emacs
+ (25 3))
+ (wisi
+ (4 3 2))
+ (gnat-compiler
+ (1 0 3)))
+ "Major mode for editing GNAT project files" tar
+ ((:url . "https://stephe-leake.org/ada/wisitoken.html")
+ (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@member.fsf.org"))
+ (:commit . "9ca25ec5ca871f04b4704b39fb3ba129694e02ac"))])
+ (gpr-query .
+ [(1 0 4)
+ ((emacs
+ (25 3))
+ (wisi
+ (4 3 0))
+ (gnat-compiler
+ (1 0 3)))
+ "Minor mode for navigating sources using gpr_query" tar
+ ((:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@member.fsf.org"))
+ (:url . "https://elpa.gnu.org/packages/gpr-query.html")
+ (:commit . "d50f92fe46828b6b675770dba3004c1ea6ab0b50"))])
+ (graphql .
+ [(0 1 2)
+ ((emacs
+ (25)))
+ "GraphQL utilities" tar
+ ((:url . "https://github.com/vermiculus/graphql.el")
+ (:keywords "hypermedia" "tools" "lisp")
+ (:maintainer "Sean Allred" . "code@seanallred.com")
+ (:authors
+ ("Sean Allred" . "code@seanallred.com"))
+ (:commit . "b57b5ca5d2d0837e1fb4a4f30c051d5f3e643f0f"))])
+ (greader .
+ [(0 12 6)
+ ((emacs
+ (26 1))
+ (seq
+ (2 24))
+ (compat
+ (29 1 4 5)))
+ "Gnamù reader, send buffer contents to a speech engine" tar
+ ((:url . "https://gitlab.com/michelangelo-rodriguez/greader")
+ (:keywords "tools" "accessibility")
+ (:maintainer "Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com")
+ (:authors
+ ("Michelangelo Rodriguez" . "michelangelo.rodriguez@gmail.com"))
+ (:commit . "a7a8d4adc4f4590669cb8cbad086db12d831ad82"))])
+ (greenbar .
+ [(1 1)
+ nil "Mark comint output with \"greenbar\" background" tar
+ ((:keywords "faces" "terminals")
+ (:maintainer "Michael R. Mauger" . "michael@mauger.com")
+ (:authors
+ ("Michael R. Mauger" . "michael@mauger.com"))
+ (:url . "https://elpa.gnu.org/packages/greenbar.html")
+ (:commit . "9526f29d073c533c3e54f0a7597eef1587ffb99e"))])
+ (gtags-mode .
+ [(1 8 2)
+ ((emacs
+ (28)))
+ "GNU Global integration with xref, project and imenu." tar
+ ((:url . "https://github.com/Ergus/gtags-mode")
+ (:keywords "xref" "project" "imenu" "gtags" "global")
+ (:commit . "506659b9ebdcc4be411759a8500763e092c8110a"))])
+ (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"))])
+ (hcel .
+ [(1 0 0)
+ ((emacs
+ (28)))
+ "Haskell codebase explorer / cross referencer" tar
+ ((:url . "https://g.ypei.me/hc.el.git")
+ (:keywords "haskell")
+ (:maintainer "Yuchen Pei" . "id@ypei.org")
+ (:authors
+ ("Yuchen Pei" . "id@ypei.org"))
+ (:commit . "a215df2f884fb445d8f159a2b4d84e6853ac9816"))])
+ (heap .
+ [(0 5)
+ nil "Heap (a.k.a. priority queue) data structure" tar
+ ((:url . "http://www.dr-qubit.org/emacs.php")
+ (:keywords "extensions" "data structures" "heap" "priority queue")
+ (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
+ (:authors
+ ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
+ (:commit . "10a68e6000bdf630aa7232e57ba25390423991d8"))])
+ (hiddenquote .
+ [(1 2)
+ ((emacs
+ (25 1)))
+ "Major mode for doing hidden quote puzzles" tar
+ ((:url . "http://mauroaranda.com/puzzles/hidden-quote-puzzle/")
+ (:keywords "games")
+ (:maintainer "Mauro Aranda" . "maurooaranda@gmail.com")
+ (:authors
+ ("Mauro Aranda" . "maurooaranda@gmail.com"))
+ (:commit . "856438ee2950fa998561f71d40355a88cdb078b4"))])
+ (highlight-escape-sequences .
+ [(0 4)
+ nil "Highlight escape sequences" tar
+ ((:url . "https://github.com/dgutov/highlight-escape-sequences")
+ (:keywords "convenience")
+ (:maintainer
+ ("Dmitry Gutov" . "dgutov@yandex.ru")
+ ("Pavel Matcula" . "dev.plvlml@gmail.com"))
+ (:authors
+ ("Dmitry Gutov" . "dgutov@yandex.ru")
+ ("Pavel Matcula" . "dev.plvlml@gmail.com"))
+ (:commit . "08d846a7aa748209d65fecead2b6a766c3e5cb41"))])
+ (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")
+ (:keywords "html" "xml")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:commit . "784c471a9ea9ae817d70b222ec6fbe90ac64a057"))])
+ (hugoista .
+ [(0 2 1)
+ ((emacs
+ (24 3))
+ (seq
+ (0)))
+ "Manage Hugo posts like a barista" tar
+ ((:url . "https://codeberg.org/c-alpha/hugoista")
+ (:maintainer "Alexander Adolf" . "alexander.adolf@condition-alpha.com")
+ (:authors
+ ("Alexander Adolf" . "alexander.adolf@condition-alpha.com")
+ ("Thanos Apollo" . "public@thanosapollo.org"))
+ (:commit . "22b543c0cb9c74ede7e762a16d44173c08c906ab"))])
+ (hydra .
+ [(0 15 0)
+ ((cl-lib
+ (0 5))
+ (lv
+ (0)))
+ "Make bindings that stick around." tar
+ ((:url . "https://github.com/abo-abo/hydra")
+ (:keywords "bindings")
+ (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com")
+ (:authors
+ ("Oleh Krehel" . "ohwoeowho@gmail.com"))
+ (:commit . "7081ee6d443dbf2b58e77fa7357c90e495173a2f"))])
+ (hyperbole .
+ [(9 0 1)
+ ((emacs
+ (27 1)))
+ "GNU Hyperbole: The Everyday Hypertextual Information Manager" tar
+ ((:url . "http://www.gnu.org/software/hyperbole")
+ (:keywords "comm" "convenience" "files" "frames" "hypermedia" "languages" "mail" "matching" "mouse" "multimedia" "outlines" "tools" "wp")
+ (:maintainer "Mats Lidell" . "matsl@gnu.org")
+ (:commit . "23b118ddb6e0595e3b0668dbce8fa4e8bcec5e71"))])
+ (idlwave .
+ [(6 5 1)
+ nil "IDL editing mode for GNU Emacs" tar
+ ((:keywords "languages")
+ (:maintainer "J.D. Smith" . "jdtsmith@gmail.com")
+ (:url . "https://elpa.gnu.org/packages/idlwave.html")
+ (:commit . "e1fcd7244cb32df1e90b09729e53474e50a2e808"))])
+ (ilist .
+ [(0 4)
+ nil "Display a list in an ibuffer way." tar
+ ((:url . "https://gitlab.com/mmemmew/ilist")
+ (:keywords "convenience")
+ (:maintainer "Durand" . "mmemmew@gmail.com")
+ (:authors
+ ("Durand" . "mmemmew@gmail.com"))
+ (:commit . "5a57e52122fe483fa9bd39049c13a25334e408da"))])
+ (indent-bars .
+ [(0 8 2)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1)))
+ "Highlight indentation with bars" tar
+ ((:url . "https://github.com/jdtsmith/indent-bars")
+ (:keywords "convenience")
+ (:maintainer "J.D. Smith" . "jdtsmith+elpa@gmail.com")
+ (:authors
+ ("J.D. Smith" . "jdtsmith+elpa@gmail.com"))
+ (:commit . "e1dbddc5afa2c0fe4c6cc2151142f4509c0cbcf0"))])
+ (inspector .
+ [(0 38)
+ ((emacs
+ (27 1)))
+ "Tool for inspection of Emacs Lisp objects" tar
+ ((:url . "https://github.com/mmontone/emacs-inspector")
+ (:keywords "debugging" "tool" "lisp" "development")
+ (:maintainer "Mariano Montone" . "marianomontone@gmail.com")
+ (:authors
+ ("Mariano Montone" . "marianomontone@gmail.com"))
+ (:commit . "c5617289dd40efb45f8160420c29000c7d7489de"))])
+ (ioccur .
+ [(2 6)
+ ((emacs
+ (24))
+ (cl-lib
+ (0 5)))
+ "Incremental occur" tar
+ ((:url . "https://github.com/thierryvolpiatto/ioccur")
+ (:maintainer "Thierry Volpiatto" . "thievol@posteo.net")
+ (:authors
+ ("Thierry Volpiatto" . "thievol@posteo.net"))
+ (:commit . "33bf6f73e314ade8da27dd793c69c21312c97f10"))])
+ (isearch-mb .
+ [(0 8)
+ ((emacs
+ (27 1)))
+ "Control isearch from the minibuffer" tar
+ ((:url . "https://github.com/astoff/isearch-mb")
+ (:keywords "matching")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "927ea1790bd0c474be5f63bd9c23874e6c61fb48"))])
+ (iterators .
+ [(0 1 1)
+ ((emacs
+ (25)))
+ "Functions for working with iterators" tar
+ ((:keywords "extensions" "elisp")
+ (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de")
+ (:authors
+ ("Michael Heerdegen" . "michael_heerdegen@web.de"))
+ (:url . "https://elpa.gnu.org/packages/iterators.html")
+ (:commit . "99bdcc8bdfcbc6a8de3d2675450c2fe0aa0e72fd"))])
+ (ivy .
+ [(0 15 1)
+ ((emacs
+ (24 5)))
+ "Incremental Vertical completYon" tar
+ ((:url . "https://github.com/abo-abo/swiper")
+ (:keywords "matching")
+ (:maintainer "Basil L. Contovounesios" . "basil@contovou.net")
+ (:authors
+ ("Oleh Krehel" . "ohwoeowho@gmail.com"))
+ (:commit . "d63d52f140105d4a072fbc18f1405ab8313a4cd5"))])
+ (ivy-avy .
+ [(0 15 1)
+ ((emacs
+ (24 5))
+ (ivy
+ (0 15 1))
+ (avy
+ (0 5 0)))
+ "Avy integration for Ivy" tar
+ ((:url . "https://github.com/abo-abo/swiper")
+ (:keywords "convenience")
+ (:maintainer "Basil L. Contovounesios" . "basil@contovou.net")
+ (:authors
+ ("Oleh Krehel" . "ohwoeowho@gmail.com"))
+ (:commit . "b1fb126f19612aab7fdee74bccbf00fcaa3f908f"))])
+ (ivy-explorer .
+ [(0 3 2)
+ ((emacs
+ (25))
+ (ivy
+ (0 10 0)))
+ "Dynamic file browsing grid using ivy" tar
+ ((:url . "https://github.com/clemera/ivy-explorer")
+ (:keywords "convenience" "files" "matching")
+ (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
+ (:authors
+ ("Clemens Radermacher" . "clemera@posteo.net"))
+ (:commit . "14adb6164f1d1646f503c3e4bd9aa559805f93d7"))])
+ (ivy-hydra .
+ [(0 15 1)
+ ((emacs
+ (24 5))
+ (ivy
+ (0 15 1))
+ (hydra
+ (0 14 0)))
+ "Additional key bindings for Ivy" tar
+ ((:url . "https://github.com/abo-abo/swiper")
+ (:keywords "convenience")
+ (:maintainer "Basil L. Contovounesios" . "basil@contovou.net")
+ (:authors
+ ("Oleh Krehel" . "ohwoeowho@gmail.com"))
+ (:commit . "1c9bc4e190199c891a69af03b2cf3e3f0d00c1ec"))])
+ (ivy-posframe .
+ [(0 6 3)
+ ((emacs
+ (26 0))
+ (posframe
+ (1 0 0))
+ (ivy
+ (0 13 0)))
+ "Using posframe to show Ivy" tar
+ ((:url . "https://github.com/tumashu/ivy-posframe")
+ (:keywords "abbrev" "convenience" "matching" "ivy")
+ (:maintainer "Feng Shu" . "tumashu@163.com")
+ (:authors
+ ("Feng Shu" . "tumashu@163.com")
+ ("Naoya Yamashita" . "conao3@gmail.com"))
+ (:commit . "5d9420252ca855d6d206f1f8ef5993a6be3c618f"))])
+ (jami-bot .
+ [(0 0 4)
+ ((emacs
+ (27 1)))
+ "An extendable chat bot for the private messenger GNU Jami" tar
+ ((:url . "https://gitlab.com/hperrey/jami-bot")
+ (:keywords "comm" "jami" "messenger" "chat bot" "dbus")
+ (:maintainer "Hanno Perrey" . "hanno@hoowl.se")
+ (:authors
+ ("Hanno Perrey" . "hanno@hoowl.se"))
+ (:commit . "c2ad37e2ada14b5551a83211cc4692b39be4e5fb"))])
+ (jarchive .
+ [(0 11 0)
+ ((emacs
+ (26 1)))
+ "Open project dependencies in jar archives" tar
+ ((:url . "https://git.sr.ht/~dannyfreeman/jarchive")
+ (:keywords "tools" "languages" "jvm" "java" "clojure")
+ (:maintainer "Danny Freeman" . "danny@dfreeman.email")
+ (:commit . "2c27714a72543bd115cb164ab25647b656c65b2d"))])
+ (javaimp .
+ [(0 9 1)
+ nil "Add and reorder Java import statements in Maven/Gradle projects" tar
+ ((:keywords "java" "maven" "gradle" "programming")
+ (:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm")
+ (:authors
+ ("Filipp Gunbin" . "fgunbin@fastmail.fm"))
+ (:url . "https://elpa.gnu.org/packages/javaimp.html")
+ (:commit . "2ac7afce3c6f0b390c4b62c065a898883940d65a"))])
+ (jgraph-mode .
+ [(1 1)
+ ((cl-lib
+ (0 5)))
+ "Major mode for Jgraph files" tar
+ ((:keywords "tex" "wp")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/jgraph-mode.html")
+ (:commit . "4e13f89fe8837b84d40b969e6a5431816180a747"))])
+ (jinx .
+ [(2 0)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "Enchanted Spell Checker" tar
+ ((:url . "https://github.com/minad/jinx")
+ (:keywords "convenience" "text")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:authors
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "9c778357ffaac972c86f4acd39d70c547abcaf46"))])
+ (jit-spell .
+ [(0 4)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1)))
+ "Just-in-time spell checking" tar
+ ((:url . "https://github.com/astoff/jit-spell")
+ (:keywords "tools" "wp")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "db9cedbb2d2515ffc441fa27c839c42a657a6b71"))])
+ (js2-mode .
+ [(20231224)
+ ((emacs
+ (24 1))
+ (cl-lib
+ (0 5)))
+ "Improved JavaScript editing mode" tar
+ ((:url . "https://github.com/mooz/js2-mode/")
+ (:keywords "languages" "javascript")
+ (:maintainer
+ ("Steve Yegge" . "steve.yegge@gmail.com")
+ ("mooz" . "stillpedant@gmail.com")
+ ("Dmitry Gutov" . "dgutov@yandex.ru"))
+ (:authors
+ ("Steve Yegge" . "steve.yegge@gmail.com")
+ ("mooz" . "stillpedant@gmail.com")
+ ("Dmitry Gutov" . "dgutov@yandex.ru"))
+ (:commit . "010a536da6df345a0b9a55bbd892f5f4d0d9fdfc"))])
+ (json-mode .
+ [(0 2)
+ ((emacs
+ (25 1)))
+ "Major mode for editing JSON files" tar
+ ((:keywords "data")
+ (:maintainer "Simen Heggestøyl" . "simenheg@gmail.com")
+ (:authors
+ ("Simen Heggestøyl" . "simenheg@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/json-mode.html")
+ (:commit . "dc1e531039e381edf04787c89d17038db5dc8b77"))])
+ (jsonrpc .
+ [(1 0 25)
+ ((emacs
+ (25 2)))
+ "JSON-RPC library" tar
+ ((:keywords "processes" "languages" "extensions")
+ (:maintainer "João Távora" . "joaotavora@gmail.com")
+ (:authors
+ ("João Távora" . "joaotavora@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/jsonrpc.html")
+ (:commit . "7c552b22e64fa9173557e3511aa4e37ac1d5ea59"))])
+ (jumpc .
+ [(3 1)
+ nil "jump to previous insertion points" tar
+ ((:maintainer "Ivan Kanis" . "ivan@kanis.fr")
+ (:authors
+ ("Ivan Kanis" . "ivan@kanis.fr"))
+ (:url . "https://elpa.gnu.org/packages/jumpc.html")
+ (:commit . "ab83a2a5416f83405361e25df8cbd8aab35cb8b3"))])
+ (kind-icon .
+ [(0 2 2)
+ ((emacs
+ (27 1))
+ (svg-lib
+ (0 2 8)))
+ "Completion kind icons" tar
+ ((:url . "https://github.com/jdtsmith/kind-icon")
+ (:keywords "completion" "convenience")
+ (:maintainer "J.D. Smith" . "jdtsmith@gmail.com")
+ (:authors
+ ("J.D. Smith" . "jdtsmith@gmail.com"))
+ (:commit . "d8e73fea45cba968de0deed4b7985f5fdaafadfe"))])
+ (kiwix .
+ [(1 1 5)
+ ((emacs
+ (25 1))
+ (request
+ (0 3 0)))
+ "Searching offline Wikipedia through Kiwix." tar
+ ((:url . "https://github.com/stardiviner/kiwix.el")
+ (:keywords "kiwix" "wikipedia")
+ (:maintainer "stardiviner" . "numbchild@gmail.com")
+ (:authors
+ ("stardiviner" . "numbchild@gmail.com"))
+ (:commit . "cb843349c10b1a492ceb59da20bfcef3ef02f4b5"))])
+ (kmb .
+ [(0 1)
+ ((emacs
+ (24 1)))
+ "Kill buffers matching a regexp w/o confirmation" tar
+ ((:keywords "lisp" "convenience")
+ (:authors
+ ("Tino Calancha" . "tino.calancha@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/kmb.html")
+ (:commit . "4fee1c87e7e286d7ecd759fb74aa7a112bb51e3a"))])
+ (kubed .
+ [(0 4 3)
+ ((emacs
+ (29 1)))
+ "Kubernetes, Emacs, done!" tar
+ ((:url . "https://eshelyaron.com/kubed.html")
+ (:keywords "tools" "kubernetes" "containers")
+ (:maintainer "Eshel Yaron" . "~eshel/kubed-devel@lists.sr.ht")
+ (:authors
+ ("Eshel Yaron" . "me@eshelyaron.com"))
+ (:commit . "8f979a198537532ce7749951ee6a85072eeb0610"))])
+ (landmark .
+ [(1 0)
+ nil "Neural-network robot that learns landmarks" tar
+ ((:keywords "games" "neural network" "adaptive search" "chemotaxis")
+ (:maintainer "Terrence Brannon (was:" . "brannon@rana.usc.edu>)")
+ (:authors
+ ("Terrence Brannon (was:" . "brannon@rana.usc.edu>)"))
+ (:url . "https://elpa.gnu.org/packages/landmark.html")
+ (:commit . "422d310c7726898b8d85f95f2336c79c8aaf30eb"))])
+ (latex-table-wizard .
+ [(1 5 4)
+ ((emacs
+ (27 1))
+ (auctex
+ (12 1))
+ (transient
+ (0 3 7)))
+ "Magic editing of LaTeX tables" tar
+ ((:url . "https://github.com/enricoflor/latex-table-wizard")
+ (:keywords "convenience")
+ (:maintainer "Enrico Flor" . "enrico@eflor.net")
+ (:authors
+ ("Enrico Flor" . "enrico@eflor.net"))
+ (:commit . "b55d215dbef321194dbf10553d4c0d3b244a50f0"))])
+ (leaf .
+ [(4 5 5)
+ ((emacs
+ (24 1)))
+ "Simplify your init.el configuration, extended use-package" tar
+ ((:url . "https://github.com/conao3/leaf.el")
+ (:keywords "lisp" "settings")
+ (:maintainer "Naoya Yamashita" . "conao3@gmail.com")
+ (:authors
+ ("Naoya Yamashita" . "conao3@gmail.com"))
+ (:commit . "7cc38f9739eadc569b1179fabe7f7893167105da"))])
+ (lentic .
+ [(0 12)
+ ((emacs
+ (25))
+ (m-buffer
+ (0 13))
+ (dash
+ (2 5 0)))
+ "One buffer as a view of another" tar
+ ((:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk")
+ (:authors
+ ("Phillip Lord" . "phillip.lord@russet.org.uk"))
+ (:url . "https://elpa.gnu.org/packages/lentic.html")
+ (:commit . "180c1082c016de790f9e6596b63329657c83ce20"))])
+ (lentic-server .
+ [(0 2)
+ ((lentic
+ (0 8))
+ (web-server
+ (0 1 1)))
+ "Web Server for Emacs Literate Source" tar
+ ((:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk")
+ (:authors
+ ("Phillip Lord" . "phillip.lord@newcastle.ac.uk"))
+ (:url . "https://elpa.gnu.org/packages/lentic-server.html")
+ (:commit . "732b88e7a183707ba65c38e8b3517cac42572644"))])
+ (let-alist .
+ [(1 0 6)
+ ((emacs
+ (24 1)))
+ "Easily let-bind values of an assoc-list by their names" tar
+ ((:keywords "extensions" "lisp")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:url . "https://elpa.gnu.org/packages/let-alist.html")
+ (:commit . "77fb84e6db96cbaa70e230f4881e4ede6e028f15"))])
+ (lex .
+ [(1 2)
+ nil "Lexical analyser construction" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/lex.html")
+ (:commit . "c7d76551cce66901b9f172f903ce720526c0fb52"))])
+ (lin .
+ [(1 1 0)
+ ((emacs
+ (27 1)))
+ "Make `hl-line-mode' more suitable for selection UIs" tar
+ ((:url . "https://github.com/protesilaos/lin")
+ (:keywords "convenience" "faces" "theme")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "647be281945185a20f37363fd335e99ad0540eff"))])
+ (listen .
+ [(0 9)
+ ((emacs
+ (29 1))
+ (persist
+ (0 6))
+ (taxy
+ (0 10))
+ (taxy-magit-section
+ (0 13))
+ (transient
+ (0 5 3)))
+ "Audio/Music player" tar
+ ((:url . "https://github.com/alphapapa/listen.el")
+ (:keywords "multimedia")
+ (:maintainer "Adam Porter" . "adam@alphapapa.net")
+ (:authors
+ ("Adam Porter" . "adam@alphapapa.net"))
+ (:commit . "61c511541af474027c012de7063ddfdb3f8cc780"))])
+ (literate-scratch .
+ [(1 0)
+ ((emacs
+ (29 1)))
+ "Lisp Interaction w/ text paragraphs" tar
+ ((:url . "https://git.spwhitton.name/dotfiles/tree/.emacs.d/site-lisp/literate-scratch.el")
+ (:keywords "lisp" "text")
+ (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name")
+ (:authors
+ ("Sean Whitton" . "spwhitton@spwhitton.name"))
+ (:commit . "c22a15e86acf28da716532c26ba1371574c8e979"))])
+ (llm .
+ [(0 24 2)
+ ((emacs
+ (28 1))
+ (plz
+ (0 8))
+ (plz-event-source
+ (0 1 1))
+ (plz-media-type
+ (0 2 1)))
+ "Interface to pluggable llm backends" tar
+ ((:url . "https://github.com/ahyatt/llm")
+ (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com")
+ (:authors
+ ("Andrew Hyatt" . "ahyatt@gmail.com"))
+ (:commit . "79f8606855d718cc9e417e68ca9c148f4c6443ca"))])
+ (lmc .
+ [(1 4)
+ nil "Little Man Computer in Elisp" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/lmc.html")
+ (:commit . "b65ac802b4f55fd8e5809fcf7a6f6da1e11e853a"))])
+ (load-dir .
+ [(0 0 5)
+ nil "Load all Emacs Lisp files in a given directory" tar
+ ((:keywords "lisp" "files" "convenience")
+ (:url . "https://elpa.gnu.org/packages/load-dir.html")
+ (:commit . "4c43baee082cc5a6f966c441008c6c479acbc5b7"))])
+ (load-relative .
+ [(1 3 2)
+ nil "Relative file load (within a multi-file Emacs package)" tar
+ ((:url . "https://github.com/rocky/emacs-load-relative")
+ (:keywords "internal")
+ (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
+ (:authors
+ ("Rocky Bernstein" . "rocky@gnu.org"))
+ (:commit . "e79d8f1581991381a9e3f1657af59dd0c35058fa"))])
+ (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 5)
+ ((emacs
+ (25 1)))
+ "Perform an occur-like folding in current buffer" tar
+ ((:url . "https://github.com/fourier/loccur")
+ (:keywords "matching")
+ (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com")
+ (:authors
+ ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com"))
+ (:commit . "2120345933a1617cc5359dabd7636fd3479441bf"))])
+ (logos .
+ [(1 2 0)
+ ((emacs
+ (27 1)))
+ "Simple focus mode and extras" tar
+ ((:url . "https://github.com/protesilaos/logos")
+ (:keywords "convenience" "focus" "writing" "presentation" "narrowing")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "79270ec67d81f45f4431d850fbbb31eaca92f24f"))])
+ (luwak .
+ [(1 0 0)
+ ((emacs
+ (28)))
+ "Web browser based on lynx -dump." tar
+ ((:url . "https://g.ypei.me/luwak.git")
+ (:keywords "web-browser" "lynx" "html" "tor")
+ (:maintainer "Yuchen Pei" . "id@ypei.org")
+ (:authors
+ ("Yuchen Pei" . "id@ypei.org"))
+ (:commit . "37a36288c8d4cdba461812dbdf5da434ca156fee"))])
+ (lv .
+ [(0 15 0)
+ nil "Other echo area" tar
+ ((:url . "https://elpa.gnu.org/packages/lv.html")
+ (:commit . "54e9db2b023e03b6f6b46aeec48ea74fd51d4e11"))])
+ (m-buffer .
+ [(0 16 1)
+ ((seq
+ (2 14)))
+ "List-Oriented, Functional Buffer Manipulation" tar
+ ((:maintainer "Phillip Lord" . "phillip.lord@russet.rg.uk")
+ (:authors
+ ("Phillip Lord" . "phillip.lord@russet.org.uk"))
+ (:url . "https://elpa.gnu.org/packages/m-buffer.html")
+ (:commit . "5e7714835b2289f61dad24c0b5cf98d28fc313b0"))])
+ (map .
+ [(3 3 1)
+ ((emacs
+ (26)))
+ "Map manipulation functions" tar
+ ((:keywords "extensions" "lisp")
+ (:maintainer nil . "emacs-devel@gnu.org")
+ (:authors
+ ("Nicolas Petton" . "nicolas@petton.fr"))
+ (:url . "https://elpa.gnu.org/packages/map.html")
+ (:commit . "9da2efb670574b473ab864ae0456b4f1b38e680b"))])
+ (marginalia .
+ [(2 0)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "Enrich existing commands with completion annotations" tar
+ ((:url . "https://github.com/minad/marginalia")
+ (:keywords "docs" "help" "matching" "completion")
+ (:maintainer
+ ("Omar Antolín Camarena" . "omar@matem.unam.mx")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:authors
+ ("Omar Antolín Camarena" . "omar@matem.unam.mx")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "c51fd9e4d4258543e0cd8dedda941789163bec5a"))])
+ (markchars .
+ [(0 2 2)
+ nil "Mark chars fitting certain characteristics" tar
+ ((:maintainer "Lennart Borgman" . "lennart.borgman@gmail.com")
+ (:authors
+ ("Lennart Borgman" . "lennart.borgman@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/markchars.html")
+ (:commit . "f069a7637a97239ecab7f34fd07fddfafb02ba3f"))])
+ (math-symbol-lists .
+ [(1 3)
+ nil "Lists of Unicode math symbols and latex commands" tar
+ ((:url . "https://github.com/vspinu/math-symbol-lists")
+ (:keywords "unicode" "symbols" "mathematics")
+ (:maintainer "Vitalie Spinu" . "spinuvit@gmail.com")
+ (:authors
+ ("Vitalie Spinu" . "spinuvit@gmail.com"))
+ (:commit . "590d9f09f8ad9aab747b97f077396a2035dcf50f"))])
+ (mathjax .
+ [(0 1)
+ ((emacs
+ (27 1)))
+ "Render formulas using MathJax" tar
+ ((:url . "https://github.com/astoff/mathjax.el")
+ (:keywords "tex" "text" "tools")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "db669451bbee7d2ea9872c28661c4679391b9644"))])
+ (matlab-mode .
+ [(6 3)
+ ((emacs
+ (27 2)))
+ "major mode for MATLAB(R) dot-m files" tar
+ ((:url . "https://github.com/mathworks/Emacs-MATLAB-Mode")
+ (:keywords "matlab(r)")
+ (:maintainer
+ ("Eric M. Ludlam" . "eludlam@mathworks.com")
+ ("Uwe Brauer" . "oub@mat.ucm.es"))
+ (:authors
+ ("Matt Wette" . "mwette@alumni.caltech.edu")
+ ("Eric M. Ludlam" . "eludlam@mathworks.com"))
+ (:commit . "935137844e16551a5369f928d2591556be7fb9c2"))])
+ (mct .
+ [(1 0 0)
+ ((emacs
+ (29 1)))
+ "Minibuffer Confines Transcended" tar
+ ((:url . "https://git.sr.ht/~protesilaos/mct")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "2cbf74edb4f4553d7075b34e06adcf59e96efda2"))])
+ (memory-usage .
+ [(0 2)
+ nil "Analyze the memory usage of Emacs in various ways" tar
+ ((:keywords "maint")
+ (:maintainer "Stefan Monnier" . "monnier@cs.yale.edu")
+ (:authors
+ ("Stefan Monnier" . "monnier@cs.yale.edu"))
+ (:url . "https://elpa.gnu.org/packages/memory-usage.html")
+ (:commit . "cb73fe66a59d737a72a5ed4259794b1d75aefa2c"))])
+ (metar .
+ [(0 3)
+ ((cl-lib
+ (0 5)))
+ "Retrieve and decode METAR weather information" tar
+ ((:keywords "comm")
+ (:maintainer "Mario Lang" . "mlang@delysid.org")
+ (:authors
+ ("Mario Lang" . "mlang@delysid.org"))
+ (:url . "https://elpa.gnu.org/packages/metar.html")
+ (:commit . "623639e7d6912c4d71dc8f0aea5ad1e9ede41cf8"))])
+ (midi-kbd .
+ [(0 2)
+ ((emacs
+ (25)))
+ "Create keyboard events from Midi input" tar
+ ((:keywords "convenience" "hardware" "multimedia")
+ (:maintainer "David Kastrup" . "dak@gnu.org")
+ (:authors
+ ("David Kastrup" . "dak@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/midi-kbd.html")
+ (:commit . "d23eea421486cf94e0282ac0cc43fd9700174c77"))])
+ (mines .
+ [(1 6)
+ ((emacs
+ (24 4))
+ (cl-lib
+ (0 5)))
+ "Minesweeper game" tar
+ ((:url . "https://github.com/calancha/Minesweeper")
+ (:keywords "games")
+ (:maintainer "Tino Calancha" . "tino.calancha@gmail.com")
+ (:authors
+ ("Tino Calancha" . "tino.calancha@gmail.com"))
+ (:commit . "868e9b9650be1bcc1a5e6ff5a66806eccd1fe26e"))])
+ (minibuffer-header .
+ [(0 5)
+ ((emacs
+ (27 1)))
+ "Minibuffer header line" tar
+ ((:url . "https://github.com/rougier/minibuffer-header")
+ (:keywords "convenience")
+ (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")
+ (:commit . "fe5d90d3f13c0010eed3b5dd437b458f8bf3da5f"))])
+ (minibuffer-line .
+ [(0 1)
+ nil "Display status info in the minibuffer window" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/minibuffer-line.html")
+ (:commit . "852874725fd06329109b2d431d8af5502b54036c"))])
+ (minimap .
+ [(1 4)
+ nil "Sidebar showing a \"mini-map\" of a buffer" tar
+ ((:maintainer "David Engster" . "deng@randomsample.de")
+ (:authors
+ ("David Engster" . "deng@randomsample.de"))
+ (:url . "https://elpa.gnu.org/packages/minimap.html")
+ (:commit . "2ff29c5d6abae3637d6174d889f39745fcd13fa5"))])
+ (mmm-mode .
+ [(0 5 11)
+ ((emacs
+ (25 1))
+ (cl-lib
+ (0 2)))
+ "Allow Multiple Major Modes in a buffer" tar
+ ((:url . "https://github.com/dgutov/mmm-mode")
+ (:keywords "convenience" "faces" "languages" "tools")
+ (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev")
+ (:authors
+ ("Michael Abraham Shulman" . "viritrilbia@gmail.com"))
+ (:commit . "b1f5c7dbdc405e6e10d9ddd99a43a6b2ad61b176"))])
+ (modus-themes .
+ [(4 6 0)
+ ((emacs
+ (27 1)))
+ "Elegant, highly legible and customizable themes" tar
+ ((:url . "https://github.com/protesilaos/modus-themes")
+ (:keywords "faces" "theme" "accessibility")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "895e10936adac93aa8187c9cc91092dbca898677"))])
+ (mpdired .
+ [(3)
+ ((emacs
+ (29)))
+ "A dired-like client for Music Player Daemon" tar
+ ((:keywords "multimedia")
+ (:maintainer "Manuel Giraud" . "manuel@ledu-giraud.fr")
+ (:authors
+ ("Manuel Giraud" . "manuel@ledu-giraud.fr"))
+ (:url . "https://elpa.gnu.org/packages/mpdired.html")
+ (:commit . "793ec28c47d25f36806eb5e692025d61fb6a1bb3"))])
+ (multi-mode .
+ [(1 14)
+ nil "support for multiple major modes" tar
+ ((:url . "http://www.loveshack.ukfsn.org/emacs")
+ (:keywords "languages" "extensions" "files")
+ (:maintainer "Dave Love" . "fx@gnu.org")
+ (:authors
+ ("Dave Love" . "fx@gnu.org"))
+ (:commit . "03dae71ad44bd5d10495011f124a1cd6f43f795d"))])
+ (multishell .
+ [(1 1 10)
+ ((cl-lib
+ (0 5)))
+ "Organize use of multiple shell buffers, local and remote" tar
+ ((:url . "https://github.com/kenmanheimer/EmacsMultishell")
+ (:keywords "processes")
+ (:maintainer "Ken Manheimer" . "ken.manheimer@gmail.com")
+ (:authors
+ ("Ken Manheimer" . "ken.manheimer@gmail.com"))
+ (:commit . "aa1433b8df6d950e8592c7e878922b4ec5374569"))])
+ (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" tar
+ ((:keywords "list" "containers")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/myers.html")
+ (:commit . "cc8d39d05c4a48545336510df7ac9ab186611ea2"))])
+ (nadvice .
+ [(0 4)
+ nil "Forward compatibility for Emacs-24.4's nadvice" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/nadvice.html")
+ (:commit . "d19e9ae649374a0f2fab1baa045ed192e0851750"))])
+ (nameless .
+ [(1 0 2)
+ ((emacs
+ (24 4)))
+ "Hide package namespace in your emacs-lisp code" tar
+ ((:url . "https://github.com/Malabarba/nameless")
+ (:keywords "convenience" "lisp")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:commit . "ab1a5c589378334eafca105af1a17f73b9065423"))])
+ (names .
+ [(20151201 0)
+ ((emacs
+ (24 1))
+ (cl-lib
+ (0 5)))
+ "Namespaces for emacs-lisp. Avoid name clobbering without hiding symbols." tar
+ ((:url . "https://github.com/Malabarba/names")
+ (:keywords "extensions" "lisp")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:commit . "465df8ed03f9d6c926566b81ef8abc93f8357983"))])
+ (nano-agenda .
+ [(0 3)
+ ((emacs
+ (27 1)))
+ "N Λ N O agenda" tar
+ ((:url . "https://github.com/rougier/nano-agenda")
+ (:keywords "convenience" "org-mode" "org-agenda")
+ (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")
+ (:commit . "6c38e95b8e846aceb88398c682fd283052924556"))])
+ (nano-modeline .
+ [(1 1 0)
+ ((emacs
+ (27 1)))
+ "N Λ N O modeline" tar
+ ((:url . "https://github.com/rougier/nano-modeline")
+ (:keywords "convenience" "mode-line" "header-line")
+ (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")
+ (:commit . "04676d57a1e602123a593836745a744d1b2028fb"))])
+ (nano-theme .
+ [(0 3 4)
+ ((emacs
+ (27 1)))
+ "N Λ N O theme" tar
+ ((:url . "https://github.com/rougier/nano-theme")
+ (:keywords "theme" "dark" "light")
+ (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")
+ (:commit . "34a3efc37b329064a320225361ad833c57017485"))])
+ (nftables-mode .
+ [(1 1)
+ ((emacs
+ (25 1)))
+ "Major mode for editing nftables" tar
+ ((:keywords "convenience")
+ (:maintainer nil . "emacs-devel@gnu.org")
+ (:authors
+ ("Trent W. Buck" . "trentbuck@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/nftables-mode.html")
+ (:commit . "05600129ee8ea0774c6ac446a2bd18fc1dde54eb"))])
+ (nhexl-mode .
+ [(1 5)
+ ((emacs
+ (24 4))
+ (cl-lib
+ (0 5)))
+ "Minor mode to edit files via hex-dump format" tar
+ ((:keywords "data")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/nhexl-mode.html")
+ (:commit . "ec80692dec04e238f2ae3284cfd8f9d05ac1d2a3"))])
+ (nlinum .
+ [(1 9)
+ nil "Show line numbers in the margin" tar
+ ((:keywords "convenience")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/nlinum.html")
+ (:commit . "99d0fef381e9f44a3fdcf66f28c28109a7cdaf45"))])
+ (notes-mode .
+ [(1 31)
+ nil "Indexing system for on-line note-taking" tar
+ ((:url . "https://ant.isi.edu/~johnh/SOFTWARE/NOTES_MODE/")
+ (:maintainer "John Heidemann" . "johnh@isi.edu")
+ (:authors
+ ("John Heidemann" . "johnh@isi.edu"))
+ (:commit . "2a25d79f7e5d9ab7298ba40e11e78d1f2ded06d2"))])
+ (notmuch-indicator .
+ [(1 2 0)
+ ((emacs
+ (27 1)))
+ "Display mode line indicator with notmuch-count(1) output" tar
+ ((:url . "https://github.com/protesilaos/notmuch-indicator")
+ (:keywords "convenience" "mail")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "7aa1da708aeb9f729e8e0a99ef65341b7344815e"))])
+ (ntlm .
+ [(2 1 0)
+ nil "NTLM (NT LanManager) authentication support" tar
+ ((:keywords "ntlm" "sasl" "comm")
+ (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
+ (:authors
+ ("Taro Kawagishi" . "tarok@transpulse.org"))
+ (:url . "https://elpa.gnu.org/packages/ntlm.html")
+ (:commit . "1add5ec3a270cba99549dc7e78c529c3dd190784"))])
+ (num3-mode .
+ [(1 5)
+ nil "highlight groups of digits in long numbers" tar
+ ((:keywords "faces" "minor-mode")
+ (:maintainer "Michal Nazarewicz" . "mina86@mina86.com")
+ (:authors
+ ("Felix Lee" . "felix8a@gmail.com")
+ ("Michal Nazarewicz" . "mina86@mina86.com"))
+ (:url . "https://elpa.gnu.org/packages/num3-mode.html")
+ (:commit . "fdf4d633e541875a6f765f5c3c8e0d4911122ed3"))])
+ (oauth2 .
+ [(0 17)
+ ((cl-lib
+ (0 5))
+ (nadvice
+ (0 3)))
+ "OAuth 2.0 Authorization Protocol" tar
+ ((:keywords "comm")
+ (:maintainer "Julien Danjou" . "julien@danjou.info")
+ (:authors
+ ("Julien Danjou" . "julien@danjou.info"))
+ (:url . "https://elpa.gnu.org/packages/oauth2.html")
+ (:commit . "0147cabd8e82e46af27aef07aeed402b0bb9a0fb"))])
+ (ob-asymptote .
+ [(1 0 1)
+ nil "Babel Functions for Asymptote" tar
+ ((:url . "https://github.com/hurrja/ob-asymptote")
+ (:keywords "literate programming" "reproducible research")
+ (:maintainer "Jarmo Hurri" . "jarmo.hurri@iki.fi")
+ (:commit . "2afd4ebe1162cfdecd1206d8fe73a9e35c452b3a"))])
+ (ob-haxe .
+ [(1 0)
+ nil "org-babel functions for haxe evaluation" tar
+ ((:url . "https://orgmode.org")
+ (:keywords "literate programming" "reproducible research")
+ (:maintainer "Ian Martins" . "ianxm@jhu.edu")
+ (:authors
+ ("Ian Martins" . "ianxm@jhu.edu"))
+ (:commit . "d52fa3bc87310a560bed8e6362e412c4b3d73294"))])
+ (objed .
+ [(0 8 3)
+ ((emacs
+ (25))
+ (cl-lib
+ (0 5)))
+ "Navigate and edit text objects." tar
+ ((:url . "https://github.com/clemera/objed")
+ (:keywords "convenience")
+ (:maintainer "Clemens Radermacher" . "clemera@posteo.net")
+ (:authors
+ ("Clemens Radermacher" . "clemera@posteo.net"))
+ (:commit . "01f062187912785ebaa2961036802c777cbbc65d"))])
+ (omn-mode .
+ [(1 3)
+ nil "Support for OWL Manchester Notation" tar
+ ((:maintainer "Phillip Lord" . "phillip.lord@newcastle.ac.uk")
+ (:authors
+ ("Phillip Lord" . "phillip.lord@newcastle.ac.uk"))
+ (:url . "https://elpa.gnu.org/packages/omn-mode.html")
+ (:commit . "ec1d34f63b6d79fc0db7ed79c3d1c5747c0d6d6b"))])
+ (on-screen .
+ [(1 3 3)
+ ((cl-lib
+ (0)))
+ "guide your eyes while scrolling" tar
+ ((:url . "https://github.com/michael-heerdegen/on-screen.el")
+ (:keywords "convenience")
+ (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de")
+ (:authors
+ ("Michael Heerdegen" . "michael_heerdegen@web.de"))
+ (:commit . "cfc449d68e762cf05297bb923a48e9bbd0af1b92"))])
+ (openpgp .
+ [(1 0 2)
+ ((emacs
+ (24 4)))
+ "Client for keys.openpgp.org" tar
+ ((:url . "https://git.sr.ht/~pkal/openpgp/")
+ (:keywords "convenience")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "69254001eae10b3b162200082bcbc684363e84d7"))])
+ (orderless .
+ [(1 4)
+ ((emacs
+ (27 1))
+ (compat
+ (30)))
+ "Completion style for matching regexps in any order" tar
+ ((:url . "https://github.com/oantolin/orderless")
+ (:keywords "matching" "completion")
+ (:maintainer
+ ("Omar Antolín Camarena" . "omar@matem.unam.mx")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:authors
+ ("Omar Antolín Camarena" . "omar@matem.unam.mx"))
+ (:commit . "254f2412489bbbf62700f9d3d5f18e537841dcc3"))])
+ (org .
+ [(9 7 27)
+ ((emacs
+ (26 1)))
+ "Outline-based notes management and organizer" tar
+ ((:url . "https://orgmode.org")
+ (:keywords "outlines" "hypermedia" "calendar" "text")
+ (:maintainer "Bastien Guerry" . "bzg@gnu.org")
+ (:authors
+ ("Carsten Dominik" . "carsten.dominik@gmail.com"))
+ (:commit . "74dde3abae74c97ba336a11a1d0efcb79585e32f"))])
+ (org-contacts .
+ [(1 1)
+ ((emacs
+ (27 1))
+ (org
+ (9 3 4)))
+ "Contacts management system for Org Mode" tar
+ ((:url . "https://repo.or.cz/org-contacts.git")
+ (:keywords "contacts" "org-mode" "outlines" "hypermedia" "calendar")
+ (:maintainer "stardiviner" . "numbchild@gmail.com")
+ (:authors
+ ("Julien Danjou" . "julien@danjou.info"))
+ (:commit . "217ba04c9d638067a6ccb0829cf1885f54c1d568"))])
+ (org-edna .
+ [(1 1 2)
+ ((emacs
+ (25 1))
+ (seq
+ (2 19))
+ (org
+ (9 0 5)))
+ "Extensible Dependencies 'N' Actions" tar
+ ((:url . "https://savannah.nongnu.org/projects/org-edna-el/")
+ (:keywords "convenience" "text" "org")
+ (:maintainer "Ian Dunn" . "dunni@gnu.org")
+ (:authors
+ ("Ian Dunn" . "dunni@gnu.org"))
+ (:commit . "8258a4dfa00aa522249cdf9aeea5be4de97bd7c1"))])
+ (org-gnosis .
+ [(0 0 9)
+ ((emacs
+ (27 2))
+ (emacsql
+ (4 0 0))
+ (compat
+ (29 1 4 2)))
+ "Roam-like Knowledge Management System" tar
+ ((:url . "https://thanosapollo.org/projects/org-gnosis/")
+ (:keywords "extensions")
+ (:maintainer "Thanos Apollo" . "public@thanosapollo.org")
+ (:authors
+ ("Thanos Apollo" . "public@thanosapollo.org"))
+ (:commit . "2f1ed5320b8e9b31c67c0720be2693fe416f16a1"))])
+ (org-jami-bot .
+ [(0 0 5)
+ ((emacs
+ (28 1))
+ (jami-bot
+ (0 0 4)))
+ "Capture GNU Jami messages as notes and todos in Org mode" tar
+ ((:url . "https://gitlab.com/hperrey/org-jami-bot")
+ (:keywords "comm" "outlines" "org-capture" "jami")
+ (:maintainer "Hanno Perrey" . "hanno@hoowl.se")
+ (:authors
+ ("Hanno Perrey" . "hanno@hoowl.se"))
+ (:commit . "020b03f299dad438f65d7bcbf93553b273fd7c33"))])
+ (org-modern .
+ [(1 7)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "Modern looks for Org" tar
+ ((:url . "https://github.com/minad/org-modern")
+ (:keywords "outlines" "hypermedia" "text")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:authors
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "e7a4c5e4a1d309895c60b3a3b3e62ab1f6a926b4"))])
+ (org-notify .
+ [(0 1 1)
+ ((emacs
+ (25 1)))
+ "Notifications for Org-mode" tar
+ ((:url . "https://github.com/p-m/org-notify")
+ (:keywords "notification" "todo-list" "alarm" "reminder" "pop-up" "calendar")
+ (:maintainer "Peter Münster" . "pm@a16n.net")
+ (:authors
+ ("Peter Münster" . "pm@a16n.net"))
+ (:commit . "c08cf5b931960bc12eb782c1fe1ec82266cb4bc8"))])
+ (org-real .
+ [(1 0 11)
+ ((emacs
+ (26 1))
+ (boxy
+ (2 0))
+ (org
+ (9 3)))
+ "Keep track of real things as org-mode links" tar
+ ((:url . "https://gitlab.com/grinn.amy/org-real")
+ (:keywords "tools")
+ (:maintainer "Amy Grinn" . "grinn.amy@gmail.com")
+ (:authors
+ ("Amy Grinn" . "grinn.amy@gmail.com"))
+ (:commit . "aa45c5dc795779e4f25e4a8200da06454e070a79"))])
+ (org-remark .
+ [(1 3 0)
+ ((emacs
+ (27 1))
+ (org
+ (9 4)))
+ "Highlight & annotate text, Info, EPUB, EWW" tar
+ ((:url . "https://github.com/nobiot/org-remark")
+ (:keywords "org-mode" "annotation" "note-taking" "marginal-notes" "wp")
+ (:maintainer "Noboru Ota" . "me@nobiot.com")
+ (:authors
+ ("Noboru Ota" . "me@nobiot.com"))
+ (:commit . "c458649989ab32babb61cf9fc5c178cdaef1a62a"))])
+ (org-transclusion .
+ [(1 4 0)
+ ((emacs
+ (27 1))
+ (org
+ (9 4)))
+ "Transclude text content via links" tar
+ ((:url . "https://github.com/nobiot/org-transclusion")
+ (:keywords "org-mode" "transclusion" "writing")
+ (:maintainer "Noboru Ota" . "me@nobiot.com")
+ (:authors
+ ("Noboru Ota" . "me@nobiot.com"))
+ (:commit . "e6e638710e90198070c9b07ebdaa345a79f74706"))])
+ (org-translate .
+ [(0 1 4)
+ ((emacs
+ (27 1))
+ (org
+ (9 1)))
+ "Org-based translation environment" tar
+ ((:maintainer "Eric Abrahamsen" . "eric@ericabrahamsen.net")
+ (:authors
+ ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
+ (:url . "https://elpa.gnu.org/packages/org-translate.html")
+ (:commit . "bdc5d169ef0c502f46aa673918ccf34fcc8415f2"))])
+ (orgalist .
+ [(1 16)
+ ((emacs
+ (26 1)))
+ "Manage Org-like lists in non-Org buffers" tar
+ ((:keywords "convenience")
+ (:maintainer "Nicolas Goaziou" . "mail@nicolasgoaziou.fr")
+ (:authors
+ ("Nicolas Goaziou" . "mail@nicolasgoaziou.fr"))
+ (:url . "https://elpa.gnu.org/packages/orgalist.html")
+ (:commit . "1f540f645eeb338019750d4dca3c056a1f5eca6d"))])
+ (osc .
+ [(0 4)
+ nil "Open Sound Control protocol library" tar
+ ((:keywords "comm" "processes" "multimedia")
+ (:maintainer "Mario Lang" . "mlang@blind.guru")
+ (:authors
+ ("Mario Lang" . "mlang@blind.guru"))
+ (:url . "https://elpa.gnu.org/packages/osc.html")
+ (:commit . "6b6dbb4176f45f9ff3a783c816c4556ca2931a22"))])
+ (osm .
+ [(1 6)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "OpenStreetMap viewer" tar
+ ((:url . "https://github.com/minad/osm")
+ (:keywords "network" "multimedia" "hypermedia" "mouse")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:authors
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "308e67cc25c2c2725a32f48fed6e67c87dcc3eed"))])
+ (other-frame-window .
+ [(1 0 6)
+ ((emacs
+ (24 4)))
+ "Minor mode to enable global prefix keys for other frame/window buffer placement" tar
+ ((:keywords "frame" "window")
+ (:maintainer "Stephen Leake" . "stephen_leake@member.fsf.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@member.fsf.org"))
+ (:url . "https://elpa.gnu.org/packages/other-frame-window.html")
+ (:commit . "7477b00664bff9b0b9edfe7ecbef379a7543ba77"))])
+ (pabbrev .
+ [(4 3 0)
+ ((emacs
+ (25 1)))
+ "Predictive abbreviation expansion" tar
+ ((:url . "https://github.com/phillord/pabbrev")
+ (:maintainer "Arthur Miller" . "arthur.miller@live.com")
+ (:authors
+ ("Phillip Lord" . "phillip.lord@newcastle.ac.uk"))
+ (:commit . "0c281401b47bd67d2726326c1a415c2bd219395f"))])
+ (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/")
+ (:keywords "convenience" "completion")
+ (:maintainer "Ian Dunn" . "dunni@gnu.org")
+ (:authors
+ ("Ian Dunn" . "dunni@gnu.org"))
+ (:commit . "c3683a0a8a611fbd15bb3ec78ccac121843711c9"))])
+ (package-x .
+ [(1 0)
+ nil "Package extras" tar
+ ((:keywords "tools")
+ (:maintainer "Philip Kaludercic" . "philipk@posteo.net")
+ (:authors
+ ("Tom Tromey" . "tromey@redhat.com"))
+ (:url . "https://elpa.gnu.org/packages/package-x.html")
+ (:commit . "a4aaf1a7dc31af40b33435fae3c1674d744031f7"))])
+ (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"))])
+ (parser-generator .
+ [(0 2 4)
+ ((emacs
+ (26)))
+ "Parser Generator library" tar
+ ((:url . "https://github.com/cjohansson/emacs-parser-generator")
+ (:keywords "tools" "convenience")
+ (:maintainer "Christian Johansson" . "christian@cvj.se")
+ (:authors
+ ("Christian Johansson" . "christian@cvj.se"))
+ (:commit . "06458c9c925a07eb548d1c1ac6502ed7ca320e87"))])
+ (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 . "https://elpa.gnu.org/packages/path-iterator.html")
+ (:commit . "df6a5e2d7e0399bac4f6d016dc272943bbb04e5e"))])
+ (peg .
+ [(1 0 1)
+ ((emacs
+ (25)))
+ "Parsing Expression Grammars in Emacs Lisp" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Helmut Eller" . "eller.helmut@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/peg.html")
+ (:commit . "90c9004a8347209f94a37c8d9506425721098402"))])
+ (perl-doc .
+ [(0 81)
+ ((emacs
+ (27)))
+ "Read Perl documentation" tar
+ ((:url . "https://github.com/HaraldJoerg/emacs-perl-doc")
+ (:keywords "languages")
+ (:maintainer "Harald Jörg" . "haj@posteo.de")
+ (:authors
+ ("Harald Jörg" . "haj@posteo.de"))
+ (:commit . "638009f98a144790ea85fd0fa311d7499fdac94f"))])
+ (persist .
+ [(0 6 1)
+ ((emacs
+ (26 1)))
+ "Persist Variables between Emacs Sessions" tar
+ ((:maintainer "Joseph Turner" . "persist-el@breatheoutbreathe.in")
+ (:authors
+ ("Phillip Lord" . "phillip.lord@russet.org.uk"))
+ (:url . "https://elpa.gnu.org/packages/persist.html")
+ (:commit . "5ea8f32ef50ce2b444d6918e17eedce9f74629af"))])
+ (phpinspect .
+ [(2 1 0)
+ ((compat
+ (29)))
+ "PHP parsing and code intelligence package" tar
+ ((:url . "https://github.com/hugot/phpinspect.el")
+ (:keywords "php" "languages" "tools" "convenience")
+ (:maintainer "Hugo Thunnissen" . "devel@hugot.nl")
+ (:authors
+ ("Hugo Thunnissen" . "devel@hugot.nl"))
+ (:commit . "1cdfd9aaf6fee003554d3c7832224455ddd9eaa1"))])
+ (phps-mode .
+ [(0 4 50)
+ ((emacs
+ (26)))
+ "Major mode for PHP with code intelligence" tar
+ ((:url . "https://github.com/cjohansson/emacs-phps-mode")
+ (:keywords "tools" "convenience")
+ (:maintainer "Christian Johansson" . "christian@cvj.se")
+ (:authors
+ ("Christian Johansson" . "christian@cvj.se"))
+ (:commit . "6a44501e58457240ea4f1818e9096d52b502e7c6"))])
+ (pinentry .
+ [(0 1)
+ nil "GnuPG Pinentry server implementation" tar
+ ((:keywords "gnupg")
+ (:maintainer "Daiki Ueno" . "ueno@gnu.org")
+ (:authors
+ ("Daiki Ueno" . "ueno@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/pinentry.html")
+ (:commit . "ef0d62bba29dfab07624d030032ec0f67d34e865"))])
+ (plz .
+ [(0 9 1)
+ ((emacs
+ (27 1)))
+ "HTTP library" tar
+ ((:url . "https://github.com/alphapapa/plz.el")
+ (:keywords "comm" "network" "http")
+ (:maintainer "Adam Porter" . "adam@alphapapa.net")
+ (:authors
+ ("Adam Porter" . "adam@alphapapa.net"))
+ (:commit . "c579f039ffdb52ff61775ff25510a9c26e25d0c5"))])
+ (plz-event-source .
+ [(0 1 2)
+ ((emacs
+ (26 3))
+ (plz-media-type
+ (0 2 3)))
+ "Plz Event Source" tar
+ ((:url . "https://github.com/r0man/plz-event-source")
+ (:keywords "comm" "network" "http")
+ (:maintainer "r0man" . "roman@burningswell.com")
+ (:authors
+ ("r0man" . "roman@burningswell.com"))
+ (:commit . "70e93039ffa843475591dc98b11df6fe5c4d85d0"))])
+ (plz-media-type .
+ [(0 2 3)
+ ((emacs
+ (26 3))
+ (plz
+ (0 9 1)))
+ "Plz Media Types" tar
+ ((:url . "https://github.com/r0man/plz-media-type")
+ (:keywords "comm" "network" "http")
+ (:maintainer "r0man" . "roman@burningswell.com")
+ (:authors
+ ("r0man" . "roman@burningswell.com"))
+ (:commit . "72a8149ccbb8a2a0fe83da342103d6d7f1cd5a96"))])
+ (plz-see .
+ [(0 1)
+ ((emacs
+ (29 1))
+ (plz
+ (0 7)))
+ "Interactive HTTP client" tar
+ ((:url . "https://github.com/astoff/plz-see.el")
+ (:keywords "comm" "network" "http")
+ (:maintainer "Augusto Stoffel" . "arstoffel@gmail.com")
+ (:authors
+ ("Augusto Stoffel" . "arstoffel@gmail.com"))
+ (:commit . "c55e6aa2971caad582df1d449e0f57604250cae1"))])
+ (poke .
+ [(3 2)
+ ((emacs
+ (25)))
+ "Emacs meets GNU poke!" tar
+ ((:url . "https://www.jemarch.net/poke")
+ (:maintainer "Jose E. Marchesi" . "jemarch@gnu.org")
+ (:authors
+ ("Jose E. Marchesi" . "jemarch@gnu.org"))
+ (:commit . "77bdcce97e06bbd6771f35acbb3f399457bebb71"))])
+ (poke-mode .
+ [(3 1)
+ nil "Major mode for editing Poke programs" tar
+ ((:maintainer "Jose E. Marchesi" . "jemarch@gnu.org")
+ (:authors
+ ("Aurelien Aptel" . "aaptel@suse.com"))
+ (:url . "https://elpa.gnu.org/packages/poke-mode.html")
+ (:commit . "340bb45867cce7f86d09a00b809c2c2078302a9e"))])
+ (poker .
+ [(0 2)
+ nil "Texas hold 'em poker" tar
+ ((:keywords "games")
+ (:maintainer "Mario Lang" . "mlang@delysid.org")
+ (:authors
+ ("Mario Lang" . "mlang@delysid.org"))
+ (:url . "https://elpa.gnu.org/packages/poker.html")
+ (:commit . "56469f23f29dba8f8beefd308b01a0b1bbc81756"))])
+ (popper .
+ [(0 4 8)
+ ((emacs
+ (26 1)))
+ "Summon and dismiss buffers as popups" tar
+ ((:url . "https://github.com/karthink/popper")
+ (:keywords "convenience")
+ (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")
+ (:authors
+ ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com"))
+ (:commit . "91b71955db19014d7139191660272c736458d87d"))])
+ (posframe .
+ [(1 4 4)
+ ((emacs
+ (26 1)))
+ "Pop a posframe (just a frame) at point" tar
+ ((:url . "https://github.com/tumashu/posframe")
+ (:keywords "convenience" "tooltip")
+ (:maintainer "Feng Shu" . "tumashu@163.com")
+ (:authors
+ ("Feng Shu" . "tumashu@163.com"))
+ (:commit . "570273bcf6c21641f02ccfcc9478607728f0a2a2"))])
+ (pq .
+ [(0 2)
+ ((emacs
+ (25)))
+ "libpq binding" tar
+ ((:url . "https://github.com/anse1/emacs-libpq")
+ (:maintainer "Tom Gillespie" . "tgbugs@gmail.com")
+ (:authors
+ ("Tom Gillespie" . "tgbugs@gmail.com"))
+ (:commit . "4dad5fcdbbb362a0dc2dfa7b5a38dd5be1551c68"))])
+ (preview-auto .
+ [(0 4)
+ ((emacs
+ (29 3))
+ (auctex
+ (14 0 5)))
+ "Automatic previews in AUCTeX" tar
+ ((:url . "https://github.com/ultronozm/preview-auto.el")
+ (:keywords "tex" "convenience")
+ (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com")
+ (:authors
+ ("Paul D. Nelson" . "nelson.paul.david@gmail.com"))
+ (:commit . "fcbd9f12c323da336089bf008920c0a290126393"))])
+ (preview-tailor .
+ [(0 2)
+ ((emacs
+ (29 1))
+ (auctex
+ (0)))
+ "Tailor AUCTeX preview scale to monitor/text scale" tar
+ ((:url . "https://github.com/ultronozm/preview-tailor.el")
+ (:keywords "tex" "multimedia")
+ (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com")
+ (:authors
+ ("Paul D. Nelson" . "nelson.paul.david@gmail.com"))
+ (:commit . "bb92fac553c8ddb87f64f4c9829762b58764c1ff"))])
+ (project .
+ [(0 11 1)
+ ((emacs
+ (26 1))
+ (xref
+ (1 7 0)))
+ "Operations on the current project" tar
+ ((:url . "https://elpa.gnu.org/packages/project.html")
+ (:commit . "08e38818f6ff4e514ac291bc5a7686f4390759b0"))])
+ (psgml .
+ [(1 3 5)
+ nil "SGML-editing mode with parsing support" tar
+ ((:keywords "languages")
+ (:maintainer "Lennart Staflin" . "lstaflin@gmail.com")
+ (:authors
+ ("Lennart Staflin" . "lenst@lysator.liu.se")
+ ("James Clark" . "jjc@clark.com"))
+ (:url . "https://elpa.gnu.org/packages/psgml.html")
+ (:commit . "697fcf7d80513257d90b7331297495bb9e01003d"))])
+ (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"))])
+ (pulsar .
+ [(1 2 0)
+ ((emacs
+ (28 1)))
+ "Pulse highlight on demand or after select functions" tar
+ ((:url . "https://github.com/protesilaos/pulsar")
+ (:keywords "convenience" "pulse" "highlight")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "2b9c9736b6ff3559acf2a65e3a29574dc7787523"))])
+ (pyim .
+ [(5 3 4)
+ ((emacs
+ (27 1))
+ (async
+ (1 6))
+ (xr
+ (1 13)))
+ "A Chinese input method support quanpin, shuangpin, wubi, cangjie and rime." tar
+ ((:url . "https://github.com/tumashu/pyim")
+ (:keywords "convenience" "chinese" "pinyin" "input-method")
+ (:maintainer "Feng Shu" . "tumashu@163.com")
+ (:authors
+ ("Ye Wenbin" . "wenbinye@163.com")
+ ("Feng Shu" . "tumashu@163.com"))
+ (:commit . "f22c20f2e6af55b3a758defabe4c842fb94cde2b"))])
+ (pyim-basedict .
+ [(0 5 5)
+ ((pyim
+ (3 7)))
+ "The default pinyin dict of pyim" tar
+ ((:url . "https://github.com/tumashu/pyim-basedict")
+ (:keywords "convenience" "chinese" "pinyin" "input-method" "complete")
+ (:maintainer "Feng Shu" . "tumashu@163.com")
+ (:authors
+ ("Feng Shu" . "tumashu@163.com"))
+ (:commit . "55d9b324831b0fc79ff62f1c6f21aad72341a114"))])
+ (python .
+ [(0 30)
+ ((emacs
+ (29 1))
+ (compat
+ (29 1 1 0))
+ (seq
+ (2 23))
+ (project
+ (0 1))
+ (flymake
+ (1 0)))
+ "Python's flying circus support for Emacs" tar
+ ((:url . "https://github.com/fgallina/python.el")
+ (:keywords "languages")
+ (:maintainer nil . "emacs-devel@gnu.org")
+ (:authors
+ ("Fabián E. Gallina" . "fgallina@gnu.org"))
+ (:commit . "672df0288b55f8bb7ebacdce5335f9e11955482e"))])
+ (quarter-plane .
+ [(0 1)
+ nil "editing using quarter-plane screen model" tar
+ ((:keywords "convenience" "wp")
+ (:url . "https://elpa.gnu.org/packages/quarter-plane.html")
+ (:commit . "8cf26bf19d0193068bef34dd0103e8a7ea566afa"))])
+ (queue .
+ [(0 2)
+ nil "Queue data structure" tar
+ ((:url . "http://www.dr-qubit.org/emacs.php")
+ (:keywords "extensions" "data structures" "queue")
+ (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
+ (:authors
+ ("Inge Wallin" . "inge@lysator.liu.se")
+ ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
+ (:commit . "c9ec2e33f26b068c40b8391e91a7839546fa8355"))])
+ (rainbow-mode .
+ [(1 0 6)
+ nil "Colorize color names in buffers" tar
+ ((:keywords "faces")
+ (:maintainer "Julien Danjou" . "julien@danjou.info")
+ (:authors
+ ("Julien Danjou" . "julien@danjou.info"))
+ (:url . "https://elpa.gnu.org/packages/rainbow-mode.html")
+ (:commit . "ac68593018ef3555e64ea592d72334f4e3e39209"))])
+ (rbit .
+ [(0 1)
+ nil "Red-black persistent interval trees" tar
+ ((:keywords "data structures" "binary tree" "intervals")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/rbit.html")
+ (:commit . "59da8b3219a9632e1ed4ce85f58a6f3c68b61684"))])
+ (rcirc-color .
+ [(0 4 5)
+ ((emacs
+ (24 4)))
+ "color nicks" tar
+ ((:keywords "comm")
+ (:maintainer "Alex Schroeder" . "alex@gnu.org")
+ (:authors
+ ("Alex Schroeder" . "alex@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/rcirc-color.html")
+ (:commit . "79449152cb71ec4d719d4b1a95c1192fb9831ceb"))])
+ (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"))])
+ (rcirc-sqlite .
+ [(1 0 4)
+ ((emacs
+ (30 0)))
+ "rcirc logging in SQLite" tar
+ ((:url . "https://codeberg.org/mattof/rcirc-sqlite")
+ (:keywords "comm")
+ (:maintainer "Matto Fransen" . "matto@matto.nl")
+ (:authors
+ ("Matto Fransen" . "matto@matto.nl"))
+ (:commit . "349aabcbb6bd10b007f431d180e870a5918b9e21"))])
+ (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/")
+ (:keywords "debugger" "gdb" "python" "perl" "go" "bash" "zsh" "bashdb" "zshdb" "remake" "trepan" "perldb" "pdb")
+ (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
+ (:authors
+ ("Rocky Bernstein" . "rocky@gnu.org"))
+ (:commit . "53938f04d5252677484e5c48513e1c138aafc756"))])
+ (realgud-ipdb .
+ [(1 0 0)
+ ((realgud
+ (1 4 5))
+ (emacs
+ (24)))
+ "realgud front-end to ipdb" tar
+ ((:url . "http://github.com/rocky/realgud-ipdb")
+ (:commit . "ba41636ac4102bdc9d28a5ae7177b3792be55933"))])
+ (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"))
+ (:commit . "f2f77d6ddfa42430ead400eaf81c605c3a04dead"))])
+ (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"))
+ (:commit . "ce008862ea33de0a9e6c06099b9ddff8f620f2e4"))])
+ (realgud-trepan-xpy .
+ [(1 0 1)
+ ((realgud
+ (1 5 0))
+ (load-relative
+ (1 3 1))
+ (emacs
+ (25)))
+ "Realgud front-end to trepan-xpy" tar
+ ((:url . "https://github.com/realgud/realgud-trepan-xpy")
+ (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
+ (:authors
+ ("Rocky Bernstein" . "rocky@gnu.org"))
+ (:commit . "f758f48266d90775643454e72214e40a4ed320b8"))])
+ (rec-mode .
+ [(1 9 4)
+ ((emacs
+ (25)))
+ "Major mode for viewing/editing rec files" tar
+ ((:url . "https://www.gnu.org/software/recutils/")
+ (:maintainer "Antoine Kalmbach" . "ane@iki.fi")
+ (:authors
+ ("Jose E. Marchesi" . "jemarch@gnu.org"))
+ (:commit . "8d9b73870acdd0a282a5c2829b139a93a39366dc"))])
+ (register-list .
+ [(0 1)
+ nil "Interactively list/edit registers" tar
+ ((:keywords "register")
+ (:maintainer "Bastien Guerry" . "bzgATalternDOTorg")
+ (:authors
+ ("Bastien Guerry" . "bzgATalternDOTorg"))
+ (:url . "https://elpa.gnu.org/packages/register-list.html")
+ (:commit . "14d719a6f3596856228f08d3746a7bf92dd13240"))])
+ (relint .
+ [(2 1)
+ ((xr
+ (2 0))
+ (emacs
+ (27 1)))
+ "Elisp regexp mistake finder" tar
+ ((:url . "https://github.com/mattiase/relint")
+ (:keywords "lisp" "regexps")
+ (:maintainer "Mattias Engdegård" . "mattiase@acm.org")
+ (:authors
+ ("Mattias Engdegård" . "mattiase@acm.org"))
+ (:commit . "9eda48e439e13479151be4abbf47906326bc732f"))])
+ (repology .
+ [(1 2 4)
+ ((emacs
+ (26 1)))
+ "Repology API access via Elisp" tar
+ ((:keywords "web")
+ (:maintainer "Nicolas Goaziou" . "mail@nicolasgoaziou.fr")
+ (:authors
+ ("Nicolas Goaziou" . "mail@nicolasgoaziou.fr"))
+ (:url . "https://elpa.gnu.org/packages/repology.html")
+ (:commit . "a6b41709525e60bdac807f153a3199003ee9d50f"))])
+ (rich-minority .
+ [(1 0 3)
+ ((cl-lib
+ (0 5)))
+ "Clean-up and Beautify the list of minor-modes." tar
+ ((:url . "https://github.com/Malabarba/rich-minority")
+ (:keywords "mode-line" "faces")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:commit . "d33d2e357c8eb0b38624dbc51e8b953b08b0cc98"))])
+ (rnc-mode .
+ [(0 3)
+ nil "Emacs mode to edit Relax-NG Compact files" tar
+ ((:keywords "xml" "relaxng")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/rnc-mode.html")
+ (:commit . "dfee31d83208b734ed1d1fdc523565d7056db850"))])
+ (rt-liberation .
+ [(7)
+ nil "Emacs interface to RT" tar
+ ((:url . "http://www.nongnu.org/rtliber/")
+ (:keywords "rt" "tickets")
+ (:maintainer "Yoni Rabkin" . "yrk@gnu.org")
+ (:authors
+ ("Yoni Rabkin" . "yrk@gnu.org"))
+ (:commit . "3b98d22c76de94fae16434517b99525fabc58f31"))])
+ (ruby-end .
+ [(0 4 3)
+ nil "Automatic insertion of end blocks for Ruby" tar
+ ((:url . "http://github.com/rejeep/ruby-end")
+ (:keywords "speed" "convenience" "ruby")
+ (:maintainer "Dmitry Gutov" . "dgutov@yandex.ru")
+ (:authors
+ ("Johan Andersson" . "johan.rejeep@gmail.com"))
+ (:commit . "fe39d34ba7a43d522c7bdc47406935611e782ca3"))])
+ (rudel .
+ [(0 3 2)
+ ((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/")
+ (:keywords "rudel" "collaboration")
+ (:maintainer "Jan Moringen" . "scymtym@users.sourceforge.net")
+ (:authors
+ ("Jan Moringen" . "scymtym@users.sourceforge.net"))
+ (:commit . "42684c4fb26318291c8c06b184166c470d465ff4"))])
+ (satchel .
+ [(0 2)
+ ((emacs
+ (27 2))
+ (project
+ (0 8 1)))
+ "A bag for your files, separated by git branches" tar
+ ((:keywords "tools" "languages")
+ (:maintainer "Theodor Thornhill" . "theo@thornhill.no")
+ (:authors
+ ("Theodor Thornhill" . "theo@thornhill.no"))
+ (:url . "https://elpa.gnu.org/packages/satchel.html")
+ (:commit . "6e5613e203f6937202cb5d55249e7e6be939067b"))])
+ (scanner .
+ [(0 3)
+ ((emacs
+ (25 1))
+ (dash
+ (2 12 0)))
+ "Scan documents and images" tar
+ ((:url . "https://codeberg.org/rstocker/scanner.git")
+ (:keywords "hardware" "multimedia")
+ (:maintainer "Raffael Stocker" . "r.stocker@mnet-mail.de")
+ (:authors
+ ("Raffael Stocker" . "r.stocker@mnet-mail.de"))
+ (:commit . "44eab47963a61e67cd4aa3a96a6762764367de5f"))])
+ (scroll-restore .
+ [(1 0)
+ nil "restore original position after scrolling" tar
+ ((:keywords "scrolling")
+ (:maintainer "Martin Rudalics" . "rudalics@gmx.at")
+ (:authors
+ ("Martin Rudalics" . "rudalics@gmx.at"))
+ (:url . "https://elpa.gnu.org/packages/scroll-restore.html")
+ (:commit . "af8f3beae533c030d4899c235473aa15bfcb2010"))])
+ (sed-mode .
+ [(1 1)
+ nil "Major mode to edit sed scripts" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/sed-mode.html")
+ (:commit . "6009f57567959387b9e34068567e982b6991eb24"))])
+ (seq .
+ [(2 24)
+ nil "Sequence manipulation functions" tar
+ ((:keywords "sequences")
+ (:maintainer nil . "emacs-devel@gnu.org")
+ (:authors
+ ("Nicolas Petton" . "nicolas@petton.fr"))
+ (:url . "https://elpa.gnu.org/packages/seq.html")
+ (:commit . "27a90793a13f149121180e864fa53d68b9eac0b3"))])
+ (setup .
+ [(1 4 0)
+ ((emacs
+ (26 1)))
+ "Helpful Configuration Macro" tar
+ ((:url . "https://git.sr.ht/~pkal/setup")
+ (:keywords "lisp" "local")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "858ea70760426a9e1fa1ce1f21fb8f8d62bd1803"))])
+ (shelisp .
+ [(1 0 0)
+ nil "execute elisp in shell" tar
+ ((:keywords "terminals" "lisp" "processes")
+ (:maintainer "Michael R. Mauger" . "michael@mauger.com")
+ (:authors
+ ("Michael R. Mauger" . "michael@mauger.com"))
+ (:url . "https://elpa.gnu.org/packages/shelisp.html")
+ (:commit . "32f91342f0039aa0e78a032b5b2a651ed5b1b79e"))])
+ (shell-command+ .
+ [(2 4 2)
+ ((emacs
+ (24 3)))
+ "An extended shell-command" tar
+ ((:url . "https://git.sr.ht/~pkal/shell-command-plus")
+ (:keywords "unix" "processes" "convenience")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "7121adb48e6fb5f03030701b9f1e25b929cb3cd3"))])
+ (shen-mode .
+ [(0 1)
+ nil "A major mode for editing shen source code" tar
+ ((:keywords "languages" "shen")
+ (:maintainer "Eric Schulte" . "schulte.eric@gmail.com")
+ (:authors
+ ("Eric Schulte" . "schulte.eric@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/shen-mode.html")
+ (:commit . "df28df31317188a6d87c9df93444543ace4f7f4f"))])
+ (show-font .
+ [(0 2 1)
+ ((emacs
+ (28 1)))
+ "Show font features in a buffer" tar
+ ((:url . "https://github.com/protesilaos/show-font")
+ (:keywords "convenience" "writing" "font")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "af941f3eafc1ee03e0d807c147ba07b878656222"))])
+ (sisu-mode .
+ [(7 1 8)
+ nil "Major mode for SiSU markup text" tar
+ ((:url . "http://www.sisudoc.org/")
+ (:keywords "text" "syntax" "processes" "tools")
+ (:commit . "456acbde87a9fa9da0ed8b441c3f22c4d5310296"))])
+ (site-lisp .
+ [(0 1 2)
+ ((emacs
+ (25 1)))
+ "Manage site-lisp directories" tar
+ ((:url . "https://git.sr.ht/~pkal/site-lisp")
+ (:keywords "lisp" "local")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "3f7a99472a4940bc63ed032de016e5a40fec0965"))])
+ (sketch-mode .
+ [(1 0 4)
+ nil "Quickly create svg sketches using keyboard and mouse" tar
+ ((:url . "https://github.com/dalanicolai/sketch-mode")
+ (:keywords "multimedia")
+ (:maintainer "D.L. Nicolai" . "dalanicolai@gmail.com")
+ (:authors
+ ("D.L. Nicolai" . "dalanicolai@gmail.com"))
+ (:commit . "ff42a587d90f9cfd3481db6f4e9a269e3a9300cd"))])
+ (slime-volleyball .
+ [(1 2 0)
+ ((cl-lib
+ (0 5)))
+ "An SVG Slime Volleyball Game" tar
+ ((:keywords "games")
+ (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
+ (:authors
+ ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))
+ (:url . "https://elpa.gnu.org/packages/slime-volleyball.html")
+ (:commit . "361d22bba0b03cd81331439c97f84583dd87c752"))])
+ (sm-c-mode .
+ [(1 2)
+ nil "C major mode based on SMIE" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/sm-c-mode.html")
+ (:commit . "a56142cb82d3390faa3dbd0658d65fe06822206d"))])
+ (smalltalk-mode .
+ [(4 0)
+ nil "Major mode for the GNU Smalltalk programming language" tar
+ ((:maintainer "Derek Zhou" . "derek@3qin.us")
+ (:url . "https://elpa.gnu.org/packages/smalltalk-mode.html")
+ (:commit . "570b705db9a02bb48cd61652639401715f419447"))])
+ (smart-yank .
+ [(0 1 1)
+ ((emacs
+ (24)))
+ "A different approach of yank pointer handling" tar
+ ((:keywords "convenience")
+ (:maintainer "Michael Heerdegen" . "michael_heerdegen@web.de")
+ (:authors
+ ("Michael Heerdegen" . "michael_heerdegen@web.de"))
+ (:url . "https://elpa.gnu.org/packages/smart-yank.html")
+ (:commit . "673e1884d3ca537143415fc91b0b06a4ae02f164"))])
+ (sml-mode .
+ [(6 12)
+ ((emacs
+ (24 3))
+ (cl-lib
+ (0 5)))
+ "Major mode for editing (Standard) ML" tar
+ ((:keywords "sml")
+ (:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Matthew Morley" . "mjm@scs.leeds.ac.uk")
+ ("Matthias Blume" . "blume@cs.princeton.edu")
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/sml-mode.html")
+ (:commit . "7ebf91114292eead967d1a9bb4f235d66f6dd525"))])
+ (so-long .
+ [(1 1 2)
+ ((emacs
+ (24 4)))
+ "Say farewell to performance problems with minified code." tar
+ ((:url . "https://savannah.nongnu.org/projects/so-long")
+ (:keywords "convenience")
+ (:maintainer "Phil Sainty" . "psainty@orcon.net.nz")
+ (:authors
+ ("Phil Sainty" . "psainty@orcon.net.nz"))
+ (:commit . "045a4fe94c18cd36ef297e62a80cdff449af3aa5"))])
+ (soap-client .
+ [(3 2 3)
+ ((emacs
+ (24 1))
+ (cl-lib
+ (0 6 1)))
+ "Access SOAP web services" tar
+ ((:url . "https://github.com/alex-hhh/emacs-soap-client")
+ (:keywords "soap" "web-services" "comm" "hypermedia")
+ (:maintainer "Alexandru Harsanyi" . "AlexHarsanyi@gmail.com")
+ (:authors
+ ("Alexandru Harsanyi" . "AlexHarsanyi@gmail.com"))
+ (:commit . "6234c3e0411a1d70bed2c85bbfb438d4479be51b"))])
+ (sokoban .
+ [(1 4 9)
+ ((emacs
+ (23 1))
+ (cl-lib
+ (0 5)))
+ "Implementation of Sokoban for Emacs." tar
+ ((:keywords "games")
+ (:maintainer "Dieter Deyke" . "dieter.deyke@gmail.com")
+ (:authors
+ ("Glynn Clements" . "glynn.clements@xemacs.org"))
+ (:url . "https://elpa.gnu.org/packages/sokoban.html")
+ (:commit . "3043723a7c2557443aa28d871137c8d9c3b46edc"))])
+ (sotlisp .
+ [(1 6 2)
+ ((emacs
+ (24 1)))
+ "Write lisp at the speed of thought." tar
+ ((:url . "https://github.com/Malabarba/speed-of-thought-lisp")
+ (:keywords "convenience" "lisp")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:commit . "fffe8d0b42b143a2e7df0470d9049fa57b6ecac5"))])
+ (spacious-padding .
+ [(0 6 0)
+ ((emacs
+ (28 1)))
+ "Increase the padding/spacing of frames and windows" tar
+ ((:url . "https://github.com/protesilaos/spacious-padding")
+ (:keywords "convenience" "focus" "writing" "presentation")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "7bbeb40fac1aeb54839cc0a3c6b31d51bed61eee"))])
+ (speedrect .
+ [(0 7)
+ ((emacs
+ (29 1))
+ (compat
+ (30)))
+ "Fast modal rectangle commands" tar
+ ((:url . "https://github.com/jdtsmith/speedrect")
+ (:keywords "convenience")
+ (:maintainer "JD Smith" . "jdtsmith+elpa@gmail.com")
+ (:authors
+ ("JD Smith" . "jdtsmith+elpa@gmail.com"))
+ (:commit . "2232149c300343732f424c1b22db296455f4c0ac"))])
+ (spinner .
+ [(1 7 4)
+ ((emacs
+ (24 3)))
+ "Add spinners and progress-bars to the mode-line for ongoing operations" tar
+ ((:url . "https://github.com/Malabarba/spinner.el")
+ (:keywords "processes" "mode-line")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:commit . "bca794fa6f6b007292cdac9b0a850a3711986db5"))])
+ (sql-beeline .
+ [(0 2)
+ nil "Beeline support for sql.el" tar
+ ((:keywords "sql" "hive" "beeline" "hiveserver2" "impala")
+ (:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm")
+ (:authors
+ ("Filipp Gunbin" . "fgunbin@fastmail.fm"))
+ (:url . "https://elpa.gnu.org/packages/sql-beeline.html")
+ (:commit . "b7ffff9404d93f569e3c2bc59db1be6e848c894f"))])
+ (sql-cassandra .
+ [(0 2 2)
+ ((emacs
+ (29)))
+ "Cassandra support for sql.el" tar
+ ((:keywords "sql" "cassandra" "cql" "cqlsh")
+ (:maintainer "Filipp Gunbin" . "fgunbin@fastmail.fm")
+ (:authors
+ ("Filipp Gunbin" . "fgunbin@fastmail.fm"))
+ (:url . "https://elpa.gnu.org/packages/sql-cassandra.html")
+ (:commit . "3e997c6ad82f4240bcd62630ad44b5f023bd16c1"))])
+ (sql-indent .
+ [(1 7)
+ ((cl-lib
+ (0 5)))
+ "Support for indenting code in SQL files." tar
+ ((:url . "https://github.com/alex-hhh/emacs-sql-indent")
+ (:keywords "languages" "sql")
+ (:maintainer "Alex Harsanyi" . "AlexHarsanyi@gmail.com")
+ (:authors
+ ("Alex Harsanyi" . "AlexHarsanyi@gmail.com"))
+ (:commit . "323ece64acaac7f27b7806db9dba0757d6e57885"))])
+ (srht .
+ [(0 4)
+ ((emacs
+ (27 1))
+ (plz
+ (0 7))
+ (transient
+ (0 4 3)))
+ "Sourcehut" tar
+ ((:url . "https://sr.ht/~akagi/srht.el/")
+ (:keywords "comm" "vc")
+ (:maintainer "Aleksandr Vityazev" . "avityazev@posteo.org")
+ (:authors
+ ("Aleksandr Vityazev" . "avityazev@posteo.org"))
+ (:commit . "053c79fb41278f11e98c61785e8cc500ed4c853b"))])
+ (ssh-deploy .
+ [(3 1 16)
+ ((emacs
+ (25)))
+ "Deployment via Tramp, global or per directory." tar
+ ((:url . "https://github.com/cjohansson/emacs-ssh-deploy")
+ (:keywords "tools" "convenience")
+ (:maintainer "Christian Johansson" . "christian@cvj.se")
+ (:authors
+ ("Christian Johansson" . "christian@cvj.se"))
+ (:commit . "95fb076c9b657c5f1bfad3ee5bf1f8691c50d428"))])
+ (standard-themes .
+ [(2 2 0)
+ ((emacs
+ (28 1)))
+ "Like the default theme but more consistent" tar
+ ((:url . "https://github.com/protesilaos/standard-themes")
+ (:keywords "faces" "theme" "accessibility")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "4b97416543a20f9d16515ff54e6481c852911843"))])
+ (stream .
+ [(2 4 0)
+ ((emacs
+ (25)))
+ "Implementation of streams" tar
+ ((:keywords "stream" "laziness" "sequences")
+ (:maintainer nil . "nicolas@petton.fr")
+ (:authors
+ ("Nicolas Petton" . "nicolas@petton.fr"))
+ (:url . "https://elpa.gnu.org/packages/stream.html")
+ (:commit . "b9b3ad5c38063703cfa5a06522031e631c49b7e3"))])
+ (substitute .
+ [(0 3 1)
+ ((emacs
+ (27 1)))
+ "Efficiently replace targets in the buffer or context" tar
+ ((:url . "https://github.com/protesilaos/substitute")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "6e7de79f8a3436fce6acfe7d04a0a375ad80dc34"))])
+ (svg .
+ [(1 1)
+ ((emacs
+ (25)))
+ "SVG image creation functions" tar
+ ((:keywords "image")
+ (:maintainer
+ ("Lars Magne Ingebrigtsen" . "larsi@gnus.org")
+ ("Felix E. Klee" . "felix.klee@inka.de"))
+ (:authors
+ ("Lars Magne Ingebrigtsen" . "larsi@gnus.org")
+ ("Felix E. Klee" . "felix.klee@inka.de"))
+ (:url . "https://elpa.gnu.org/packages/svg.html")
+ (:commit . "2c1d8397788c1385debef514c59a6461b2e5408e"))])
+ (svg-clock .
+ [(1 2)
+ ((svg
+ (1 0))
+ (emacs
+ (27 0)))
+ "Analog clock using Scalable Vector Graphics" tar
+ ((:keywords "demo" "svg" "clock")
+ (:maintainer "Ulf Jasper" . "ulf.jasper@web.de")
+ (:authors
+ ("Ulf Jasper" . "ulf.jasper@web.de"))
+ (:url . "https://elpa.gnu.org/packages/svg-clock.html")
+ (:commit . "1c04475520a125432c4e873ca944323999a3ff83"))])
+ (svg-lib .
+ [(0 3)
+ ((emacs
+ (27 1)))
+ "SVG tags, progress bars & icons" tar
+ ((:url . "https://github.com/rougier/svg-lib")
+ (:keywords "svg" "icons" "tags" "convenience")
+ (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")
+ (:commit . "f2cc9615ef3a052747135d34f31c423a26592f14"))])
+ (svg-tag-mode .
+ [(0 3 3)
+ ((emacs
+ (27 1))
+ (svg-lib
+ (0 2)))
+ "Replace keywords with SVG tags" tar
+ ((:url . "https://github.com/rougier/svg-tag-mode")
+ (:keywords "convenience")
+ (:maintainer "Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr")
+ (:authors
+ ("Nicolas P. Rougier" . "Nicolas.Rougier@inria.fr"))
+ (:commit . "49809d64e6b8084c6468d4a6ffe5523fd4dda8f4"))])
+ (swiper .
+ [(0 15 1)
+ ((emacs
+ (24 5))
+ (ivy
+ (0 15 1)))
+ "Isearch with an overview. Oh, man!" tar
+ ((:url . "https://github.com/abo-abo/swiper")
+ (:keywords "matching")
+ (:maintainer "Basil L. Contovounesios" . "basil@contovou.net")
+ (:authors
+ ("Oleh Krehel" . "ohwoeowho@gmail.com"))
+ (:commit . "6f9d587e7e5250cccf1d7f67394fcc59313db755"))])
+ (switchy-window .
+ [(1 3)
+ ((emacs
+ (25 1))
+ (compat
+ (29 1 4 1)))
+ "A most-recently-used window switcher" tar
+ ((:url . "https://sr.ht/~tsdh/switchy-window/")
+ (:keywords "windows")
+ (:maintainer "Tassilo Horn" . "tsdh@gnu.org")
+ (:authors
+ ("Tassilo Horn" . "tsdh@gnu.org"))
+ (:commit . "c743c47b7b4326c411470ba98410b7bfe3685edc"))])
+ (sxhkdrc-mode .
+ [(1 1 0)
+ ((emacs
+ (27 1)))
+ "Major mode for sxhkdrc files (Simple X Hot Key Daemon)" tar
+ ((:url . "https://github.com/protesilaos/sxhkdrc-mode")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "82816999f82a5ed5bc7c26d8ff95dbb4833dc011"))])
+ (system-packages .
+ [(1 0 13)
+ ((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"))
+ (:commit . "781f8d40ed35a86a65dda3123506dc810adc10e3"))])
+ (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"))])
+ (tam .
+ [(0 1)
+ ((queue
+ (0 2))
+ (emacs
+ (24 3)))
+ "Manage use of slots in a fixed size table" tar
+ ((:url . "https://github.com/owinebar/emacs-table-allocation-manager")
+ (:keywords "lisp" "tools")
+ (:maintainer "Onnie Lynn Winebarger" . "owinebar@gmail.com")
+ (:authors
+ ("Onnie Lynn Winebarger" . "owinebar@gmail.com"))
+ (:commit . "c254ec9f646ef5527eb1f834a90e5897caa977cf"))])
+ (taxy .
+ [(0 10 2)
+ ((emacs
+ (26 3)))
+ "Programmable taxonomical grouping for arbitrary objects" tar
+ ((:url . "https://github.com/alphapapa/taxy.el")
+ (:keywords "lisp")
+ (:maintainer "Adam Porter" . "adam@alphapapa.net")
+ (:authors
+ ("Adam Porter" . "adam@alphapapa.net"))
+ (:commit . "3099ae5cb27a34961e06a3af67555919c62c12d7"))])
+ (taxy-magit-section .
+ [(0 14 3)
+ ((emacs
+ (26 3))
+ (magit-section
+ (3 2 1))
+ (taxy
+ (0 10)))
+ "View Taxy structs in a Magit Section buffer" tar
+ ((:url . "https://github.com/alphapapa/taxy.el")
+ (:keywords "lisp")
+ (:maintainer "Adam Porter" . "adam@alphapapa.net")
+ (:authors
+ ("Adam Porter" . "adam@alphapapa.net"))
+ (:commit . "19c67f4d2e7a87cb9aed8e17058c4cf4dfd75406"))])
+ (temp-buffer-browse .
+ [(1 5)
+ ((emacs
+ (24)))
+ "temp buffer browse mode" tar
+ ((:keywords "convenience")
+ (:maintainer "Leo Liu" . "sdl.web@gmail.com")
+ (:authors
+ ("Leo Liu" . "sdl.web@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/temp-buffer-browse.html")
+ (:commit . "db6041b0413fdeefb1f1285e1d9c1039c10fbf04"))])
+ (tempel .
+ [(1 4)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "Tempo templates/snippets with in-buffer field editing" tar
+ ((:url . "https://github.com/minad/tempel")
+ (:keywords "abbrev" "languages" "tools" "text")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:authors
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "f52a99ebf6ee52a30d435ef1583dc8df3e5f2ca5"))])
+ (test-simple .
+ [(1 3 0)
+ ((cl-lib
+ (0)))
+ "Simple Unit Test Framework for Emacs Lisp" tar
+ ((:url . "http://github.com/rocky/emacs-test-simple")
+ (:keywords "unit-test")
+ (:maintainer "Rocky Bernstein" . "rocky@gnu.org")
+ (:authors
+ ("Rocky Bernstein" . "rocky@gnu.org"))
+ (:commit . "b3b69f52207d3a8111421ad7ab9ed82abbe85316"))])
+ (tex-item .
+ [(0 1)
+ ((emacs
+ (27 1)))
+ "Commands for working with tex items" tar
+ ((:url . "https://github.com/ultronozm/tex-item.el")
+ (:keywords "tex" "convenience")
+ (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com")
+ (:authors
+ ("Paul D. Nelson" . "nelson.paul.david@gmail.com"))
+ (:commit . "ee1957f3bce6ed04627b985e95a17db190781e06"))])
+ (tex-parens .
+ [(0 7)
+ ((emacs
+ (27 1)))
+ "Like lisp.el, but for tex" tar
+ ((:url . "https://github.com/ultronozm/tex-parens.el")
+ (:keywords "tex" "convenience")
+ (:maintainer "Paul D. Nelson" . "nelson.paul.david@gmail.com")
+ (:authors
+ ("Paul D. Nelson" . "nelson.paul.david@gmail.com"))
+ (:commit . "00e41b4110b4fc049513a1e31d4a00c295580026"))])
+ (theme-buffet .
+ [(0 1 2)
+ ((emacs
+ (29 1)))
+ "Time based theme switcher" tar
+ ((:url . "https://git.sr.ht/~bboal/theme-buffet")
+ (:maintainer "Theme-Buffet Development" . "~bboal/general-issues@lists.sr.ht")
+ (:authors
+ ("Bruno Boal" . "egomet@bboal.com")
+ ("Protesilaos Stavrou" . "info@protesilaos.com"))
+ (:commit . "06f1be349e9c3d124520b18742911307de9abda3"))])
+ (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"))])
+ (tmr .
+ [(1 0 0)
+ ((emacs
+ (27 1))
+ (compat
+ (30 0 0 0)))
+ "Set timers using a convenient notation" tar
+ ((:url . "https://github.com/protesilaos/tmr")
+ (:keywords "convenience" "timer")
+ (:maintainer "Protesilaos Stavrou" . "info@protesilaos.com")
+ (:authors
+ ("Protesilaos Stavrou" . "info@protesilaos.com")
+ ("Damien Cassou" . "damien@cassou.me")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "5d9b9683febe5e38838e70bb575e7f8739d77827"))])
+ (tomelr .
+ [(0 4 3)
+ ((emacs
+ (26 3))
+ (map
+ (3 2 1))
+ (seq
+ (2 23)))
+ "Convert S-expressions to TOML" tar
+ ((:url . "https://github.com/kaushalmodi/tomelr/")
+ (:keywords "data" "tools" "toml" "serialization" "config")
+ (:maintainer "Kaushal Modi" . "kaushal.modi@gmail.com")
+ (:authors
+ ("Kaushal Modi" . "kaushal.modi@gmail.com"))
+ (:commit . "670e0a08f625175fd80137cf69e799619bf8a381"))])
+ (topspace .
+ [(0 3 1)
+ ((emacs
+ (25 1)))
+ "Recenter line 1 with scrollable upper margin/padding" tar
+ ((:url . "https://github.com/trevorpogue/topspace")
+ (:keywords "convenience" "scrolling" "center" "cursor" "margin" "padding")
+ (:maintainer "Trevor Edwin Pogue" . "trevor.pogue@gmail.com")
+ (:authors
+ ("Trevor Edwin Pogue" . "trevor.pogue@gmail.com"))
+ (:commit . "33c2a6f0a11d1d88cdb2065c5a897e33507f4c86"))])
+ (track-changes .
+ [(1 4)
+ ((emacs
+ (24)))
+ "API to react to buffer modifications" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/track-changes.html")
+ (:commit . "ffb7d656a2c89f86ccd2de51379de9612c7a4aa3"))])
+ (tramp .
+ [(2 7 2 2)
+ ((emacs
+ (27 1)))
+ "Transparent Remote Access, Multiple Protocol" tar
+ ((:url . "https://www.gnu.org/software/tramp/")
+ (:keywords "comm" "processes")
+ (:maintainer "Michael Albinus" . "michael.albinus@gmx.de")
+ (:authors
+ ("Kai Großjohann" . "kai.grossjohann@gmx.net"))
+ (:commit . "03ee1a30d526613dbfd970ddbc2ca6c657e8d865"))])
+ (tramp-nspawn .
+ [(1 0 1)
+ ((emacs
+ (23)))
+ "Tramp integration for systemd-nspawn containers" tar
+ ((:url . "https://github.com/bjc/tramp-nspawn")
+ (:keywords "tramp" "nspawn" "machinectl" "systemd" "systemd-nspawn")
+ (:maintainer "Brian Cully" . "bjc@kublai.com")
+ (:authors
+ ("Brian Cully" . "bjc@kublai.com"))
+ (:commit . "c35ade49754e051c84eaa2733447b4307968f200"))])
+ (tramp-theme .
+ [(0 3)
+ ((emacs
+ (24 1)))
+ "Custom theme for remote buffers" tar
+ ((:keywords "convenience" "faces")
+ (:maintainer "Michael Albinus" . "michael.albinus@gmx.de")
+ (:authors
+ ("Michael Albinus" . "michael.albinus@gmx.de"))
+ (:url . "https://elpa.gnu.org/packages/tramp-theme.html")
+ (:commit . "f89f0c8ac25455ae59ae3e4bd8c8cb673e16130e"))])
+ (transcribe .
+ [(1 5 2)
+ nil "Package for audio transcriptions" tar
+ ((:maintainer "David Gonzalez Gandara" . "dggandara@member.fsf.org")
+ (:authors
+ ("David Gonzalez Gandara" . "dggandara@member.fsf.org"))
+ (:url . "https://elpa.gnu.org/packages/transcribe.html")
+ (:commit . "89832e4cdc1e6d8262a4a2c9d1ff70f398b8faf0"))])
+ (transient .
+ [(0 8 6)
+ ((emacs
+ (26 1))
+ (compat
+ (30 0 0 0))
+ (seq
+ (2 24)))
+ "Transient commands" tar
+ ((:url . "https://github.com/magit/transient")
+ (:keywords "extensions")
+ (:maintainer "Jonas Bernoulli" . "emacs.transient@jonas.bernoulli.dev")
+ (:authors
+ ("Jonas Bernoulli" . "emacs.transient@jonas.bernoulli.dev"))
+ (:commit . "52f737a696cad846d528a5a06e412f740a1de38a"))])
+ (transient-cycles .
+ [(1 1)
+ ((emacs
+ (27 1)))
+ "Define command variants with transient cycling" tar
+ ((:url . "https://git.spwhitton.name/dotfiles/tree/.emacs.d/site-lisp/transient-cycles.el")
+ (:keywords "buffer" "window" "minor-mode" "convenience")
+ (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name")
+ (:authors
+ ("Sean Whitton" . "spwhitton@spwhitton.name"))
+ (:commit . "456495db28a72a343907e58ee43e7470144282aa"))])
+ (tree-inspector .
+ [(0 4)
+ ((emacs
+ (27 1))
+ (treeview
+ (1 1 0)))
+ "Inspector tool for Emacs Lisp object that uses a treeview" tar
+ ((:url . "https://github.com/mmontone/emacs-inspector")
+ (:keywords "debugging" "tool" "lisp" "development")
+ (:maintainer "Mariano Montone" . "marianomontone@gmail.com")
+ (:authors
+ ("Mariano Montone" . "marianomontone@gmail.com"))
+ (:commit . "bbb8d2dfe84fbf857fcc1579de5a1324b09a877e"))])
+ (trie .
+ [(0 6)
+ ((tNFA
+ (0 1 1))
+ (heap
+ (0 3)))
+ "Trie data structure" tar
+ ((:url . "http://www.dr-qubit.org/emacs.php")
+ (:keywords "extensions" "matching" "data structures trie" "ternary search tree" "tree" "completion" "regexp")
+ (:maintainer "Toby Cubitt" . "toby-predictive@dr-qubit.org")
+ (:authors
+ ("Toby Cubitt" . "toby-predictive@dr-qubit.org"))
+ (:commit . "e7326a61b1cd2605867063fcfc5ddddaeed6d993"))])
+ (triples .
+ [(0 5 0)
+ ((seq
+ (2 0))
+ (emacs
+ (28 1)))
+ "A flexible triple-based database for use in apps" tar
+ ((:url . "https://github.com/ahyatt/triples")
+ (:keywords "triples" "kg" "data" "sqlite")
+ (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com")
+ (:authors
+ ("Andrew Hyatt" . "ahyatt@gmail.com"))
+ (:commit . "2e7cae76ac60227704c9631d27edf409b85e67c7"))])
+ (typo .
+ [(1 0 1)
+ ((emacs
+ (27 1)))
+ "Completion style using typo analysis" tar
+ ((:url . "https://git.sr.ht/~pkal/typo/")
+ (:keywords "convenience")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "281c9049c1d08cf11c8a1957ea99e5c58795ed3c"))])
+ (ulisp-repl .
+ [(1 0 3)
+ ((emacs
+ (26 1)))
+ "uLisp REPL" tar
+ ((:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
+ (:authors
+ ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))
+ (:url . "https://elpa.gnu.org/packages/ulisp-repl.html")
+ (:commit . "63e38a9080b2d15146680022e20700db6eb20657"))])
+ (undo-tree .
+ [(0 8 2)
+ ((queue
+ (0 2)))
+ "Treat undo history as a tree" tar
+ ((:url . "https://www.dr-qubit.org/undo-tree.html")
+ (:keywords "convenience" "files" "undo" "redo" "history" "tree")
+ (:maintainer "Toby Cubitt" . "toby-undo-tree@dr-qubit.org")
+ (:authors
+ ("Toby Cubitt" . "toby-undo-tree@dr-qubit.org"))
+ (:commit . "42aab056e37e033816b2d192f9121b89410b958e"))])
+ (uni-confusables .
+ [(0 3)
+ nil "Unicode confusables table" tar
+ ((:maintainer "Teodor Zlatanov" . "tzz@lifelogs.com")
+ (:url . "https://elpa.gnu.org/packages/uni-confusables.html")
+ (:commit . "393e1adeec5b0eb51f9606983655cfe2272c6e54"))])
+ (uniquify-files .
+ [(1 0 4)
+ ((emacs
+ (25 0)))
+ "Completion style for files, minimizing directories" tar
+ ((:keywords "completion" "table" "uniquify")
+ (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
+ (:url . "https://elpa.gnu.org/packages/uniquify-files.html")
+ (:commit . "1d76b4f0e283afaff2be053d85f8726ffc3abd6e"))])
+ (urgrep .
+ [(0 5 1)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1 0 1))
+ (project
+ (0 3 0)))
+ "Universal recursive grep" tar
+ ((:url . "https://github.com/jimporter/urgrep")
+ (:keywords "grep" "search")
+ (:commit . "8af67d13dea234cf68868086d539f9fcbaf058ec"))])
+ (url-http-ntlm .
+ [(2 0 5)
+ ((cl-lib
+ (0 5))
+ (ntlm
+ (2 1 0))
+ (nadvice
+ (0 3)))
+ "NTLM authentication for the url library" tar
+ ((:url . "https://code.google.com/p/url-http-ntlm/")
+ (:keywords "comm" "data" "processes" "hypermedia")
+ (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
+ (:authors
+ ("Tom Schutzer-Weissmann" . "tom.weissmann@gmail.com"))
+ (:commit . "2c76d9491304e485a91c9d457fc25130279e1324"))])
+ (url-http-oauth .
+ [(0 8 3)
+ nil "OAuth 2.0 for URL library" tar
+ ((:keywords "comm" "data" "processes" "hypermedia")
+ (:maintainer "Thomas Fitzsimmons" . "fitzsim@fitzsim.org")
+ (:authors
+ ("Thomas Fitzsimmons" . "fitzsim@fitzsim.org"))
+ (:url . "https://elpa.gnu.org/packages/url-http-oauth.html")
+ (:commit . "c2d06036f22ce61f5a1e3084c8b265d897b7fcab"))])
+ (url-scgi .
+ [(0 9)
+ ((emacs
+ (24 3)))
+ "SCGI support for url.el" tar
+ ((:url . "https://github.com/skangas/url-scgi/")
+ (:keywords "comm" "data" "processes" "scgi")
+ (:maintainer "Stefan Kangas" . "stefankangas@gmail.com")
+ (:authors
+ ("Stefan Kangas" . "stefankangas@gmail.com"))
+ (:commit . "ccf30c3647cd6a560cadc795bd92769c0a0c9de9"))])
+ (use-package .
+ [(2 4 6)
+ ((emacs
+ (24 3))
+ (bind-key
+ (2 4)))
+ "A configuration macro for simplifying your .emacs" tar
+ ((:url . "https://github.com/jwiegley/use-package")
+ (:keywords "dotemacs" "startup" "speed" "config" "package" "extensions")
+ (:maintainer "John Wiegley" . "johnw@newartisans.com")
+ (:authors
+ ("John Wiegley" . "johnw@newartisans.com"))
+ (:commit . "d8e9eb73c2b5f93adf3ae29d1349ce2161e23cb4"))])
+ (validate .
+ [(1 0 4)
+ ((emacs
+ (24 1))
+ (cl-lib
+ (0 5))
+ (seq
+ (2 16)))
+ "Schema validation for Emacs-lisp" tar
+ ((:keywords "lisp")
+ (:maintainer "Artur Malabarba" . "emacs@endlessparentheses.com")
+ (:authors
+ ("Artur Malabarba" . "emacs@endlessparentheses.com"))
+ (:url . "https://elpa.gnu.org/packages/validate.html")
+ (:commit . "2bc1a7c5f09de5deb7f27b2b4ed731271f9f3f05"))])
+ (valign .
+ [(3 1 1)
+ ((emacs
+ (26 0)))
+ "Visually align tables" tar
+ ((:url . "https://github.com/casouri/valign")
+ (:keywords "convenience" "text" "table")
+ (:maintainer "Yuan Fu" . "casouri@gmail.com")
+ (:authors
+ ("Yuan Fu" . "casouri@gmail.com"))
+ (:commit . "421c8c0cb4636e5fd87ac1022d6b8268c320f74f"))])
+ (vc-backup .
+ [(1 1 0)
+ nil "VC backend for versioned backups" tar
+ ((:url . "https://git.sr.ht/~pkal/vc-backup")
+ (:keywords "vc")
+ (:maintainer "Philip Kaludercic" . "philipk@posteo.net")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "397af1e12b2e73a00370cc3ac054ffe2402b3352"))])
+ (vc-got .
+ [(1 2)
+ ((emacs
+ (25 1)))
+ "VC backend for Game of Trees VCS" tar
+ ((:url . "https://projects.omarpolo.com/vc-got.html")
+ (:keywords "vc" "tools")
+ (:maintainer
+ ("Omar Polo" . "op@omarpolo.com")
+ ("Timo Myyrä" . "timo.myyra@bittivirhe.fi"))
+ (:authors
+ ("Omar Polo" . "op@omarpolo.com")
+ ("Timo Myyrä" . "timo.myyra@bittivirhe.fi"))
+ (:commit . "bc158324418fd8bef96a7f62856679de2569030f"))])
+ (vc-hgcmd .
+ [(1 14 1)
+ ((emacs
+ (25 1)))
+ "VC mercurial backend that uses hg command server" tar
+ ((:url . "https://github.com/muffinmad/emacs-vc-hgcmd")
+ (:keywords "vc")
+ (:maintainer "Andrii Kolomoiets" . "andreyk.mad@gmail.com")
+ (:authors
+ ("Andrii Kolomoiets" . "andreyk.mad@gmail.com"))
+ (:commit . "d044448965d31ca8214f8bca48487e4d9b9d9a0f"))])
+ (vcard .
+ [(0 2 2)
+ ((emacs
+ (27 1)))
+ "Package for handling vCard files" tar
+ ((:keywords "vcard" "mail" "news")
+ (:maintainer
+ ("Noah Friedman" . "friedman@splode.com")
+ ("Eric Abrahamsen" . "eric@ericabrahamsen.net"))
+ (:authors
+ ("Noah Friedman" . "friedman@splode.com"))
+ (:url . "https://elpa.gnu.org/packages/vcard.html")
+ (:commit . "28b88fd8ed53ca12d9499175217af81f5ea161fc"))])
+ (vcl-mode .
+ [(1 1)
+ nil "Major mode for Varnish Configuration Language" tar
+ ((:keywords "varnish" "vcl")
+ (:maintainer "Sergey Poznyakoff" . "gray@gnu.org.ua")
+ (:authors
+ ("Sergey Poznyakoff" . "gray@gnu.org.ua"))
+ (:url . "https://elpa.gnu.org/packages/vcl-mode.html")
+ (:commit . "ff7331de91e399af4b222cad0b0a1d445f82b333"))])
+ (vdiff .
+ [(0 2 4)
+ ((emacs
+ (24 4))
+ (hydra
+ (0 13 0)))
+ "A diff tool similar to vimdiff" tar
+ ((:url . "https://github.com/justbur/emacs-vdiff")
+ (:keywords "diff")
+ (:maintainer "Justin Burkett" . "justin@burkett.cc")
+ (:authors
+ ("Justin Burkett" . "justin@burkett.cc"))
+ (:commit . "007e44be19d068fd6b49874b6e9b8df8b1f552bd"))])
+ (verilog-mode .
+ [(2025 1 1 100165202)
+ nil "major mode for editing verilog source in Emacs" tar
+ ((:url . "https://www.veripool.org")
+ (:keywords "languages")
+ (:maintainer
+ ("Michael McNamara" . "mac@verilog.com")
+ ("Wilson Snyder" . "wsnyder@wsnyder.org"))
+ (:authors
+ ("Michael McNamara" . "mac@verilog.com")
+ ("Wilson Snyder" . "wsnyder@wsnyder.org"))
+ (:commit . "78bc5949db489b143f7424540d6cc56fc529c9ea"))])
+ (vertico .
+ [(2 0)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "VERTical Interactive COmpletion" tar
+ ((:url . "https://github.com/minad/vertico")
+ (:keywords "convenience" "files" "matching" "completion")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:authors
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "026a81a9c893b1d73cdbcb12436a0fad3ebdeb5f"))])
+ (vertico-posframe .
+ [(0 8 0)
+ ((emacs
+ (26 0))
+ (posframe
+ (1 4 0))
+ (vertico
+ (1 10)))
+ "Using posframe to show Vertico" tar
+ ((:url . "https://github.com/tumashu/vertico-posframe")
+ (:keywords "abbrev" "convenience" "matching" "vertico")
+ (:maintainer "Feng Shu" . "tumashu@163.com")
+ (:authors
+ ("Feng Shu" . "tumashu@163.com"))
+ (:commit . "781ee08f8d92f640dff8a0d8838b67a13a391846"))])
+ (vigenere .
+ [(1 0)
+ ((emacs
+ (25 1)))
+ "Run a vigenere cipher on a block of text ;" tar
+ ((:url . "https://elpa.gnu.org/packages/vigenere.html")
+ (:keywords "data" "vigenere" "cipher")
+ (:maintainer "Ian Dunn" . "dunni@gnu.org")
+ (:authors
+ ("Ian Dunn" . "dunni@gnu.org"))
+ (:commit . "434270403845789f4be32102c573ea965e870d19"))])
+ (visual-filename-abbrev .
+ [(1 3)
+ ((emacs
+ (26 1)))
+ "Visually abbreviate filenames" tar
+ ((:keywords "tools")
+ (:maintainer "Tassilo Horn" . "tsdh@gnu.org")
+ (:authors
+ ("Tassilo Horn" . "tsdh@gnu.org"))
+ (:url . "https://elpa.gnu.org/packages/visual-filename-abbrev.html")
+ (:commit . "4af7868db7bbc6a3c185540ba4e257d4c4c560c0"))])
+ (visual-fill .
+ [(0 2)
+ nil "Auto-refill paragraphs without modifying the buffer" tar
+ ((:maintainer "Stefan Monnier" . "monnier@iro.umontreal.ca")
+ (:authors
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (:url . "https://elpa.gnu.org/packages/visual-fill.html")
+ (:commit . "1951eaf59e25091d5597cc45e3dd5925be005122"))])
+ (vlf .
+ [(1 7 2)
+ nil "View Large Files" tar
+ ((:url . "https://github.com/m00natic/vlfi")
+ (:keywords "large files" "utilities")
+ (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com")
+ (:commit . "efffeb5f54191d41a503d1d51343bb327fe2f871"))])
+ (vundo .
+ [(2 4 0)
+ ((emacs
+ (28 1)))
+ "Visual undo tree" tar
+ ((:url . "https://github.com/casouri/vundo")
+ (:keywords "undo" "text" "editing")
+ (:maintainer "Yuan Fu" . "casouri@gmail.com")
+ (:authors
+ ("Yuan Fu" . "casouri@gmail.com"))
+ (:commit . "b89f719824fe5da0f6a7590fad3ece798fd59909"))])
+ (wcheck-mode .
+ [(2021)
+ nil "General interface for text checkers" tar
+ ((:url . "https://github.com/tlikonen/wcheck-mode")
+ (:keywords "text" "spell" "check" "languages" "ispell")
+ (:maintainer "Teemu Likonen" . "tlikonen@iki.fi")
+ (:authors
+ ("Teemu Likonen" . "tlikonen@iki.fi"))
+ (:commit . "e1c86e6f9e150ed25efb58fcf21db374b1b7f519"))])
+ (wconf .
+ [(0 2 1)
+ ((emacs
+ (24 4)))
+ "Minimal window layout manager" tar
+ ((:url . "https://github.com/ilohmar/wconf")
+ (:keywords "windows" "frames" "layout")
+ (:maintainer "Ingo Lohmar" . "i.lohmar@gmail.com")
+ (:authors
+ ("Ingo Lohmar" . "i.lohmar@gmail.com"))
+ (:commit . "833ae431a5b35739be3076ea4b586d84d6fe269f"))])
+ (web-server .
+ [(0 1 2)
+ ((emacs
+ (24 3)))
+ "Emacs Web Server" tar
+ ((:url . "https://github.com/eschulte/emacs-web-server")
+ (:keywords "http" "server" "network")
+ (:maintainer "Eric Schulte" . "schulte.eric@gmail.com")
+ (:authors
+ ("Eric Schulte" . "schulte.eric@gmail.com"))
+ (:commit . "33afdb46e1cd61251736816d965495525b36c9cd"))])
+ (webfeeder .
+ [(1 1 2)
+ ((emacs
+ (25 1)))
+ "Build RSS and Atom webfeeds from HTML files" tar
+ ((:url . "https://gitlab.com/Ambrevar/emacs-webfeeder")
+ (:keywords "news" "hypermedia" "blog" "feed" "rss" "atom")
+ (:maintainer "Pierre Neidhardt" . "mail@ambrevar.xyz")
+ (:authors
+ ("Pierre Neidhardt" . "mail@ambrevar.xyz"))
+ (:commit . "6037848ee495a67510d8b43f1fbe319b76dbd859"))])
+ (websocket .
+ [(1 15)
+ ((cl-lib
+ (0 5)))
+ "Emacs WebSocket client and server" tar
+ ((:url . "https://github.com/ahyatt/emacs-websocket")
+ (:keywords "communication" "websocket" "server")
+ (:maintainer "Andrew Hyatt" . "ahyatt@gmail.com")
+ (:authors
+ ("Andrew Hyatt" . "ahyatt@gmail.com"))
+ (:commit . "40c208eaab99999d7c1e4bea883648da24c03be3"))])
+ (which-key .
+ [(3 6 1)
+ ((emacs
+ (25 1)))
+ "Display available keybindings in popup" tar
+ ((:maintainer "Justin Burkett" . "justin@burkett.cc")
+ (:authors
+ ("Justin Burkett" . "justin@burkett.cc"))
+ (:url . "https://elpa.gnu.org/packages/which-key.html")
+ (:commit . "34b832fce1d01c22aa644196cd6e6b50b1d403ee"))])
+ (window-commander .
+ [(3 0 2)
+ ((emacs
+ (27 1)))
+ "Simply execute commands on windows" tar
+ ((:url . "https://dsemy.com/projects/window-commander")
+ (:keywords "convenience")
+ (:maintainer "Daniel Semyonov" . "daniel@dsemy.com")
+ (:authors
+ ("Daniel Semyonov" . "daniel@dsemy.com"))
+ (:commit . "ad92c184ccc06f46b2caf001bc8201d983eca626"))])
+ (window-tool-bar .
+ [(0 3)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1)))
+ "Add tool bars inside windows" tar
+ ((:url . "http://github.com/chaosemer/window-tool-bar")
+ (:keywords "mouse")
+ (:maintainer "Jared Finder" . "jared@finder.org")
+ (:authors
+ ("Jared Finder" . "jared@finder.org"))
+ (:commit . "72bbbff7e8128fe14c0b69c7282667788758b8b4"))])
+ (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" tar
+ ((:keywords "window")
+ (:maintainer "Bastien" . "bzgATalternDOTorg")
+ (:authors
+ ("Bastien" . "bzgATalternDOTorg"))
+ (:url . "https://elpa.gnu.org/packages/windresize.html")
+ (:commit . "0693d5d864ac9fd033c868bdd887e66278e056e9"))])
+ (wisi .
+ [(4 3 2)
+ ((emacs
+ (25 3))
+ (seq
+ (2 20)))
+ "Utilities for implementing an indentation/navigation engine using a generalized LR parser" tar
+ ((:url . "https://stephe-leake.org/ada/wisitoken.html")
+ (:keywords "parser" "indentation" "navigation")
+ (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
+ (:commit . "1c4b099bf1f93cebee523b0ba75ccab6c6c2a2f0"))])
+ (wisitoken-grammar-mode .
+ [(1 3 0)
+ ((wisi
+ (4 2 2))
+ (emacs
+ (25 3))
+ (mmm-mode
+ (0 5 7)))
+ "Major mode for editing WisiToken grammar files" tar
+ ((:url . "https://www.nongnu.org/ada-mode/")
+ (:keywords "languages")
+ (:maintainer "Stephen Leake" . "stephen_leake@stephe-leake.org")
+ (:authors
+ ("Stephen Leake" . "stephen_leake@stephe-leake.org"))
+ (:commit . "2d58879cea26b8a3b573d084d149dea94f93dfb8"))])
+ (wpuzzle .
+ [(1 1)
+ nil "find as many word in a given time" tar
+ ((:maintainer "Ivan Kanis" . "ivan@kanis.fr")
+ (:authors
+ ("Ivan Kanis" . "ivan@kanis.fr"))
+ (:url . "https://elpa.gnu.org/packages/wpuzzle.html")
+ (:commit . "9373cbc013b978b31e38822bfdcc9a7fc5e0ed99"))])
+ (wrap-search .
+ [(4 17 6)
+ nil "wrapped, non-incremental search" tar
+ ((:url . "https://dataswamp.org/~incal/elpa/wrap-search.el")
+ (:keywords "matching")
+ (:maintainer "Emanuel Berg" . "incal@dataswamp.org")
+ (:authors
+ ("Emanuel Berg" . "incal@dataswamp.org"))
+ (:commit . "980081a476dce22032e31b50eb4e34d54dc4788c"))])
+ (xclip .
+ [(1 11 1)
+ nil "Copy&paste GUI clipboard from text terminal" tar
+ ((:keywords "convenience" "tools")
+ (:maintainer "Leo Liu" . "sdl.web@gmail.com")
+ (:authors
+ ("Leo Liu" . "sdl.web@gmail.com"))
+ (:url . "https://elpa.gnu.org/packages/xclip.html")
+ (:commit . "7febe164de2a881b83b9d604d3c7cf20b69f422d"))])
+ (xeft .
+ [(3 3)
+ ((emacs
+ (26 0)))
+ "Deft feat. Xapian" tar
+ ((:url . "https://sr.ht/~casouri/xeft")
+ (:keywords "applications" "note" "searching")
+ (:maintainer "Yuan Fu" . "casouri@gmail.com")
+ (:authors
+ ("Yuan Fu" . "casouri@gmail.com"))
+ (:commit . "ea4fa859c1129243b15f259a10e67ea274c5ef63"))])
+ (xelb .
+ [(0 20)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1)))
+ "X protocol Emacs Lisp Binding" tar
+ ((:url . "https://github.com/emacs-exwm/xelb")
+ (:keywords "unix")
+ (:maintainer
+ ("Adrián Medraño Calvo" . "adrian@medranocalvo.com")
+ ("Steven Allen" . "steven@stebalien.com")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:authors
+ ("Chris Feng" . "chris.w.feng@gmail.com"))
+ (:commit . "bdf3a69214c70611fbce71942598c85c4fe3d6b7"))])
+ (xpm .
+ [(1 0 5)
+ ((cl-lib
+ (0 5))
+ (queue
+ (0 2)))
+ "edit XPM images" tar
+ ((:url . "https://www.gnuvola.org/software/xpm/")
+ (:keywords "multimedia" "xpm")
+ (:maintainer "Thien-Thi Nguyen" . "ttn@gnu.org")
+ (:authors
+ ("Thien-Thi Nguyen" . "ttn@gnu.org"))
+ (:commit . "85e5c412dde7ec3c3f64c64d37079e233293e4d0"))])
+ (xr .
+ [(2 1)
+ ((emacs
+ (27 1)))
+ "Convert string regexp to rx notation" tar
+ ((:url . "https://github.com/mattiase/xr")
+ (:keywords "lisp" "regexps")
+ (:maintainer "Mattias Engdegård" . "mattiase@acm.org")
+ (:authors
+ ("Mattias Engdegård" . "mattiase@acm.org"))
+ (:commit . "31cd397f54591e3692bf88d6e1995236928e3561"))])
+ (xref .
+ [(1 7 0)
+ ((emacs
+ (26 1)))
+ "Cross-referencing commands" tar
+ ((:url . "https://elpa.gnu.org/packages/xref.html")
+ (:commit . "cef848fe5f355ca34abc176739d0ace835b12eed"))])
+ (xref-union .
+ [(0 2 0)
+ ((emacs
+ (25 1)))
+ "Combine multiple Xref backends" tar
+ ((:url . "https://git.sr.ht/~pkal/xref-union/")
+ (:maintainer "Philip Kaludercic" . "~pkal/public-inbox@lists.sr.ht")
+ (:authors
+ ("Philip Kaludercic" . "philipk@posteo.net"))
+ (:commit . "2bb88d0dc526177c3c6612d6585cee6b2c57803a"))])
+ (yaml .
+ [(1 2 0)
+ ((emacs
+ (25 1)))
+ "YAML parser for Elisp" tar
+ ((:url . "https://github.com/zkry/yaml.el")
+ (:keywords "tools")
+ (:maintainer "Zachary Romero" . "zkry@posteo.org")
+ (:authors
+ ("Zachary Romero" . "zkry@posteo.org"))
+ (:commit . "09e46d563f1f3ff948852e08360c7d3c76e2acba"))])
+ (yasnippet .
+ [(0 14 1)
+ ((cl-lib
+ (0 5))
+ (emacs
+ (24 4)))
+ "Yet another snippet extension for Emacs" tar
+ ((:url . "http://github.com/joaotavora/yasnippet")
+ (:keywords "convenience" "emulation")
+ (:maintainer "Noam Postavsky" . "npostavs@gmail.com")
+ (:commit . "297546f0853a6a51f5b05e954d0c6aea8caa5ec2"))])
+ (yasnippet-classic-snippets .
+ [(1 0 2)
+ ((yasnippet
+ (0 9 1)))
+ "\"Classic\" yasnippet snippets" tar
+ ((:keywords "snippets")
+ (:maintainer "Noam Postavsky" . "npostavs@gmail.com")
+ (:url . "https://elpa.gnu.org/packages/yasnippet-classic-snippets.html")
+ (:commit . "43ff0337f5ec504f2a496f2f035a5087cd8e2074"))])
+ (zones .
+ [(2023 6 11)
+ nil "Zones of text - like multiple regions" tar
+ ((:url . "https://elpa.gnu.org/packages/zones.html")
+ (:keywords "narrow" "restriction" "widen" "region" "zone")
+ (:maintainer "Drew Adams" . "drew.adams@oracle.com")
+ (:commit . "10ebf386d48725fa3af2f8b0c60ad4ffa0ec9653"))])
+ (ztree .
+ [(1 0 6)
+ ((cl-lib
+ (0)))
+ "Text mode directory tree" tar
+ ((:url . "https://github.com/fourier/ztree")
+ (:keywords "files" "tools")
+ (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com")
+ (:authors
+ ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com"))
+ (:commit . "c9ad9136d52ca5a81475693864e255d29448f43f"))])
+ (zuul .
+ [(0 4 0)
+ ((emacs
+ (27 1))
+ (project
+ (0 8 1)))
+ "Interface to Zuul" tar
+ ((:url . "https://sr.ht/~niklaseklund/zuul.el")
+ (:keywords "convenience" "tools")
+ (:maintainer "zuul.el Development" . "~niklaseklund/zuul.el@lists.sr.ht")
+ (:authors
+ ("Niklas Eklund" . "niklas.eklund@posteo.net"))
+ (:commit . "c94886cb7abdea66ba1d0a064a4d93efed10fed4"))]))
diff --git a/elpa/archives/gnu/archive-contents.signed b/elpa/archives/gnu/archive-contents.signed
new file mode 100644
index 0000000..dbda61d
--- /dev/null
+++ b/elpa/archives/gnu/archive-contents.signed
@@ -0,0 +1 @@
+Good signature from 645357D2883A0966 GNU ELPA Signing Agent (2023) <elpasign@elpa.gnu.org> (trust undefined) created at 2025-04-01T09:05:05+0000 using EDDSA \ No newline at end of file
diff --git a/elpa/archives/nongnu/archive-contents b/elpa/archives/nongnu/archive-contents
new file mode 100644
index 0000000..4e45dbe
--- /dev/null
+++ b/elpa/archives/nongnu/archive-contents
@@ -0,0 +1,2881 @@
+(1
+ (adoc-mode .
+ [(0 7 0)
+ ((emacs
+ (26)))
+ "a major-mode for editing AsciiDoc files" tar
+ ((:url . "https://github.com/bbatsov/adoc-mode")
+ (:keywords "docs" "wp")
+ (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev")
+ (:authors
+ ("Florian Kaufmann" . "sensorflo@gmail.com"))
+ (:commit . "66b9adc97d8702de47140092cbae3a2f5563a297"))])
+ (afternoon-theme .
+ [(0 1)
+ ((emacs
+ (24 1)))
+ "Dark color theme with a deep blue background" tar
+ ((:url . "http://github.com/osener/emacs-afternoon-theme")
+ (:keywords "themes")
+ (:maintainer "Ozan Sener" . "ozan@ozansener.com")
+ (:authors
+ ("Ozan Sener" . "ozan@ozansener.com"))
+ (:commit . "b58731c3b0bbaac9d3ed8d5ae900063df5db090d"))])
+ (aidermacs .
+ [(1 1)
+ ((emacs
+ (26 1))
+ (transient
+ (0 3 0))
+ (compat
+ (30 0 2 0)))
+ "AI pair programming with Aider" tar
+ ((:url . "https://github.com/MatthewZMD/aidermacs")
+ (:keywords "ai" "emacs" "llm" "aider" "ai-pair-programming" "tools")
+ (:maintainer "Mingde Zeng" . "matthewzmd@posteo.net")
+ (:authors
+ ("Mingde Zeng" . "matthewzmd@posteo.net"))
+ (:commit . "992ab4867452fe2d2ec2153fc172fcc72281a3cd"))])
+ (alect-themes .
+ [(0 10)
+ ((emacs
+ (24 0)))
+ "Configurable light, dark and black themes for Emacs 24 or later" tar
+ ((:url . "https://github.com/alezost/alect-themes")
+ (:keywords "color" "theme")
+ (:maintainer "Alex Kost" . "alezost@gmail.com")
+ (:authors
+ ("Alex Kost" . "alezost@gmail.com"))
+ (:commit . "89560047934c236d05ea6b911c0c63702a8e06f3"))])
+ (ample-theme .
+ [(0 3 0)
+ nil "Calm Dark Theme for Emacs" tar
+ ((:url . "https://github.com/jordonbiondo/ample-theme")
+ (:keywords "theme" "dark")
+ (:maintainer "Jordon Biondo" . "jordonbiondo@gmail.com")
+ (:authors
+ ("Jordon Biondo" . "jordonbiondo@gmail.com"))
+ (:commit . "33691c93ee302690e41f631f82083bcc15d229e8"))])
+ (annotate .
+ [(2 3 1)
+ nil "annotate files without changing them" tar
+ ((:url . "https://github.com/bastibe/annotate.el")
+ (:maintainer
+ ("Bastian Bechtold" . "bastibe.dev@mailbox.org")
+ ("cage" . "cage-dev@twistfold.it"))
+ (:commit . "3413c205947ffeb26ba328cb68be947733070794"))])
+ (anti-zenburn-theme .
+ [(2 5 1)
+ nil "Low-contrast Zenburn-inverted theme" tar
+ ((:url . "https://github.com/m00natic/anti-zenburn-theme")
+ (:maintainer "Andrey Kotlarski" . "m00naticus@gmail.com")
+ (:authors
+ ("Andrey Kotlarski" . "m00naticus@gmail.com"))
+ (:commit . "c80cc51bb1aaf11dd53b9d08e01d61bc9b32622f"))])
+ (anzu .
+ [(0 66)
+ ((emacs
+ (25 1)))
+ "Show number of matches in mode-line while searching" tar
+ ((:url . "https://github.com/emacsorphanage/anzu")
+ (:maintainer "LemonBreezes" . "look@strawberrytea.xyz")
+ (:authors
+ ("Syohei YOSHIDA" . "syohex@gmail.com"))
+ (:commit . "bc3a0032bb6aa7f5886f10460cd53eb7b8b020af"))])
+ (apache-mode .
+ [(2 2 0)
+ nil "Major mode for editing Apache httpd configuration files" tar
+ ((:url . "https://github.com/emacs-php/apache-mode")
+ (:keywords "languages" "faces")
+ (:maintainer "USAMI Kenta" . "tadsan@zonu.me")
+ (:authors
+ ("Karl Chen" . "quarl@nospam.quarl.org"))
+ (:commit . "354f9302a8d805ac80d846adcd1cef10830b3d51"))])
+ (apropospriate-theme .
+ [(0 2 0)
+ nil "A light & dark theme set for Emacs." tar
+ ((:url . "http://github.com/waymondo/apropospriate-theme")
+ (:maintainer "Justin Talbott" . "justin@waymondo.com")
+ (:authors
+ ("Justin Talbott" . "justin@waymondo.com"))
+ (:commit . "cb56b8c1a4ea42a329b279e57b3db473f0be4adc"))])
+ (arduino-mode .
+ [(1 3 1)
+ ((emacs
+ (25 1))
+ (spinner
+ (1 7 3)))
+ "Major mode for editing Arduino code" tar
+ ((:url . "https://repo.or.cz/arduino-mode.git")
+ (:keywords "languages" "arduino")
+ (:maintainer "stardiviner" . "numbchild@gmail.com")
+ (:commit . "b2ffd8441851659cb1cc844156073967729585e5"))])
+ (auto-dim-other-buffers .
+ [(2 2 1)
+ ((emacs
+ (27 1)))
+ "Makes windows without focus less prominent" tar
+ ((:url . "https://github.com/mina86/auto-dim-other-buffers.el")
+ (:keywords "faces")
+ (:maintainer "Michal Nazarewicz" . "mina86@mina86.com")
+ (:authors
+ ("Michal Nazarewicz" . "mina86@mina86.com"))
+ (:commit . "0164908fd3f8d8e83aa636f08096dcc843d6b2fa"))])
+ (autothemer .
+ [(0 2 18)
+ ((dash
+ (2 10 0))
+ (emacs
+ (26 1)))
+ "Conveniently define themes" tar
+ ((:url . "https://github.com/jasonm23/autothemer")
+ (:maintainer "Jason Milkins" . "jasonm23@gmail.com")
+ (:commit . "8f72afc6dba5ad7cc3a201a084fd20571f945d2e"))])
+ (base32 .
+ [(1 0)
+ ((emacs
+ (27 1)))
+ "Base32 support" tar
+ ((:url . "https://gitlab.com/fledermaus/totp.el")
+ (:keywords "tools")
+ (:maintainer "Vivek Das Mohapatra" . "vivek@etla.org")
+ (:authors
+ ("Vivek Das Mohapatra" . "vivek@etla.org"))
+ (:commit . "v1.0"))])
+ (bash-completion .
+ [(3 2)
+ ((emacs
+ (25 3)))
+ "Bash completion for the shell buffer" tar
+ ((:url . "http://github.com/szermatt/emacs-bash-completion")
+ (:keywords "convenience" "unix")
+ (:maintainer "Stephane Zermatten" . "szermatt@gmail.com")
+ (:authors
+ ("Stephane Zermatten" . "szermatt@gmx.net"))
+ (:commit . "ed9c76252ac82d6352ba438f664b390fdd0b5d6c"))])
+ (beancount .
+ [(0 9)
+ nil "A major mode to edit Beancount input files." tar
+ ((:maintainer "Martin Blais" . "blais@furius.ca")
+ (:authors
+ ("Martin Blais" . "blais@furius.ca"))
+ (:url . "https://elpa.nongnu.org/nongnu/beancount.html")
+ (:commit . "71c16222461d947b82e45e4b986d01880b492bbb"))])
+ (better-jumper .
+ [(1 0 1)
+ ((emacs
+ (25 1)))
+ "configurable jump list" tar
+ ((:url . "https://github.com/gilbertw1/better-jumper")
+ (:keywords "convenience" "jump" "history" "evil")
+ (:maintainer "Bryan Gilbert" . "bryan@bryan.sh")
+ (:authors
+ ("Bryan Gilbert" . "http://github/gilbertw1"))
+ (:commit . "17821e7f55aeaa40c9337b766bfb991625436de4"))])
+ (bind-map .
+ [(1 1 2)
+ ((emacs
+ (24 3)))
+ "Bind personal keymaps in multiple locations" tar
+ ((:url . "https://github.com/justbur/emacs-bind-map")
+ (:maintainer "Justin Burkett" . "justin@burkett.cc")
+ (:authors
+ ("Justin Burkett" . "justin@burkett.cc"))
+ (:commit . "6977e0fec5c4a3c62a10503798c2a15194167046"))])
+ (bison-mode .
+ [(0 4)
+ nil "Major mode for editing bison, yacc and lex files." tar
+ ((:keywords "bison-mode" "yacc-mode")
+ (:maintainer "Eric Beuscher" . "beuscher@eecs.tulane.edu")
+ (:authors
+ ("Eric Beuscher" . "beuscher@eecs.tulane.edu"))
+ (:url . "https://elpa.nongnu.org/nongnu/bison-mode.html")
+ (:commit . "4f2e20394a475931409618c1635e9c9f1cf07d9c"))])
+ (blow .
+ [(1 0)
+ ((emacs
+ (24 1)))
+ "Blow away mode lighters" tar
+ ((:url . "https://codeberg.org/akib/emacs-blow")
+ (:keywords "convenience")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "19152095662c95bc73f1f25b8dcce432294b06a1"))])
+ (blueprint-ts-mode .
+ [(0 0 3)
+ ((emacs
+ (29 1)))
+ "tree-sitter support for Blueprint files" tar
+ ((:url . "https://github.com/huanie/blueprint-ts-mode")
+ (:keywords "languages" "blueprint" "tree-sitter" "gnome" "gtk")
+ (:maintainer "Huan Thieu Nguyen" . "nguyenthieuhuan@gmail.com")
+ (:authors
+ ("Huan Thieu Nguyen" . "nguyenthieuhuan@gmail.com"))
+ (:commit . "e9e56dec10f070367ab555c717c3d567a5962c82"))])
+ (boxquote .
+ [(2 3)
+ ((cl-lib
+ (0 5)))
+ "Quote text with a semi-box." tar
+ ((:url . "https://github.com/davep/boxquote.el")
+ (:keywords "quoting")
+ (:maintainer "Dave Pearson" . "davep@davep.org")
+ (:authors
+ ("Dave Pearson" . "davep@davep.org"))
+ (:commit . "fe676396fa7e4372e01bf2c3d9a62e8d53615d46"))])
+ (buttercup .
+ [(1 37)
+ ((emacs
+ (24 4)))
+ "Behavior-Driven Emacs Lisp Testing" tar
+ ((:url . "https://github.com/jorgenschaefer/emacs-buttercup")
+ (:maintainer "Ola Nilsson" . "ola.nilsson@gmail.com")
+ (:authors
+ ("Jorgen Schaefer" . "contact@jorgenschaefer.de"))
+ (:commit . "c467c659b2c5b7029e20909331e072d7301af1d5"))])
+ (camera .
+ [(0 3)
+ ((emacs
+ (25 1)))
+ "Take picture with your camera" tar
+ ((:url . "https://codeberg.org/akib/emacs-camera")
+ (:keywords "comm")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "b8aa62a8cb20006fe8545f88327cf15a1e9c03d7"))])
+ (caml .
+ [(4 9)
+ ((emacs
+ (24 3)))
+ "Caml mode for GNU Emacs" tar
+ ((:url . "https://github.com/ocaml/caml-mode")
+ (:keywords "ocaml")
+ (:maintainer "Christophe Troestler" . "Christophe.Troestler@umons.ac.be")
+ (:authors
+ ("Jacques Garrigue" . "garrigue@kurims.kyoto-u.ac.jp")
+ ("Ian T Zimmerman" . "itz@rahul.net")
+ ("Damien Doligez" . "damien.doligez@inria.fr"))
+ (:commit . "2905a436e956c5bba16c4633a6e4c4fceefa6535"))])
+ (cdlatex .
+ [(4 18 5)
+ nil "Fast input methods for LaTeX environments and math" tar
+ ((:keywords "tex")
+ (:maintainer "Carsten Dominik" . "carsten.dominik@gmail.com")
+ (:authors
+ ("Carsten Dominik" . "carsten.dominik@gmail.com"))
+ (:url . "https://elpa.nongnu.org/nongnu/cdlatex.html")
+ (:commit . "fac070f0164ac9f5859cb4cccba7d29a65c337f3"))])
+ (cider .
+ [(1 17 1)
+ ((emacs
+ (26))
+ (clojure-mode
+ (5 19))
+ (parseedn
+ (1 2 1))
+ (queue
+ (0 2))
+ (spinner
+ (1 7))
+ (seq
+ (2 22))
+ (sesman
+ (0 3 2))
+ (transient
+ (0 4 1)))
+ "Clojure Interactive Development Environment that Rocks" tar
+ ((:url . "https://www.github.com/clojure-emacs/cider")
+ (:keywords "languages" "clojure" "cider")
+ (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev")
+ (:authors
+ ("Tim King" . "kingtim@gmail.com")
+ ("Phil Hagelberg" . "technomancy@gmail.com")
+ ("Bozhidar Batsov" . "bozhidar@batsov.dev")
+ ("Artur Malabarba" . "bruce.connor.am@gmail.com")
+ ("Hugo Duncan" . "hugo@hugoduncan.org")
+ ("Steve Purcell" . "steve@sanityinc.com"))
+ (:commit . "d2f34b60e5c5e569d4b7f4f79b36893f5c4dfa20"))])
+ (clojure-mode .
+ [(5 19 0)
+ ((emacs
+ (25 1)))
+ "Major mode for Clojure code" tar
+ ((:url . "https://github.com/clojure-emacs/clojure-mode")
+ (:keywords "languages" "clojure" "clojurescript" "lisp")
+ (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev")
+ (:commit . "4afdd3539036bbd6b1c01b2e00559676c4d40085"))])
+ (clojure-ts-mode .
+ [(0 2 3)
+ ((emacs
+ (29 1)))
+ "Major mode for Clojure code" tar
+ ((:url . "http://github.com/clojure-emacs/clojure-ts-mode")
+ (:keywords "languages" "clojure" "clojurescript" "lisp")
+ (:maintainer "Danny Freeman" . "danny@dfreeman.email")
+ (:commit . "9662b6caa86b67b51aa883b35e21645233ca6f68"))])
+ (coffee-mode .
+ [(0 6 3)
+ ((emacs
+ (24 1))
+ (cl-lib
+ (0 5)))
+ "Major mode for CoffeeScript code" tar
+ ((:url . "http://github.com/defunkt/coffee-mode")
+ (:keywords "coffeescript" "major" "mode")
+ (:maintainer "Chris Wanstrath" . "chris@ozmm.org")
+ (:authors
+ ("Chris Wanstrath" . "chris@ozmm.org"))
+ (:commit . "adfb7ae73d6ee2ef790c780dd3c967e62930e94a"))])
+ (consult-flycheck .
+ [(1 0)
+ ((emacs
+ (27 1))
+ (consult
+ (1 0))
+ (flycheck
+ (32)))
+ "Provides the command `consult-flycheck'" tar
+ ((:url . "https://github.com/minad/consult")
+ (:keywords "languages" "tools" "completion")
+ (:maintainer "Daniel Mendler" . "mail@daniel-mendler.de")
+ (:commit . "0662839aa5db429130f5ffd15c14d4a980b2e694"))])
+ (corfu-terminal .
+ [(0 7)
+ ((emacs
+ (26 1))
+ (corfu
+ (0 36))
+ (popon
+ (0 13)))
+ "Corfu popup on terminal" tar
+ ((:url . "https://codeberg.org/akib/emacs-corfu-terminal")
+ (:keywords "convenience")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "501548c3d51f926c687e8cd838c5865ec45d03cc"))])
+ (crux .
+ [(0 5 0)
+ ((emacs
+ (26 1)))
+ "A Collection of Ridiculously Useful eXtensions" tar
+ ((:url . "https://github.com/bbatsov/crux")
+ (:keywords "convenience")
+ (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev")
+ (:authors
+ ("Bozhidar Batsov" . "bozhidar@batsov.dev"))
+ (:commit . "7980df10e47eef41d4d1c57cfb690ec406381ed3"))])
+ (csv2ledger .
+ [(1 5 4)
+ ((emacs
+ (29 1))
+ (csv-mode
+ (1 24)))
+ "Convert csv files to ledger entries" tar
+ ((:url . "https://codeberg.org/joostkremers/csv2ledger")
+ (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm")
+ (:authors
+ ("Joost Kremers" . "joostkremers@fastmail.fm"))
+ (:commit . "5c38ee8a4bd3edd24ff49bcbe63b1b6a659497dc"))])
+ (cyberpunk-theme .
+ [(1 22)
+ nil "Cyberpunk Color Theme" tar
+ ((:url . "https://github.com/n3mo/cyberpunk-theme.el")
+ (:keywords "color" "theme" "cyberpunk")
+ (:maintainer "Nicholas M. Van Horn" . "nvanhorn@protonmail.com")
+ (:authors
+ ("Nicholas M. Van Horn" . "nvanhorn@protonmail.com"))
+ (:commit . "81004fc774d373777d426926fc11abcf1e7ab334"))])
+ (cycle-at-point .
+ [(0 2)
+ ((emacs
+ (29 1))
+ (recomplete
+ (0 2)))
+ "Cycle (rotate) the thing under the cursor" tar
+ ((:url . "https://codeberg.org/ideasman42/emacs-cycle-at-point")
+ (:keywords "convenience")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "83d94733fd8ed64f2ba40f4e1df7ecbfe8260e51"))])
+ (d-mode .
+ [(202408131340)
+ ((emacs
+ (25 1)))
+ "D Programming Language major mode for (X)Emacs" tar
+ ((:keywords "d" "programming" "language" "emacs" "cc-mode")
+ (:maintainer
+ ("Russel Winder" . "russel@winder.org.uk")
+ ("Vladimir Panteleev" . "vladimir@thecybershadow.net"))
+ (:url . "https://elpa.nongnu.org/nongnu/d-mode.html")
+ (:commit . "688f5af819e461badfd6fda642937153b4946813"))])
+ (dart-mode .
+ [(1 0 7)
+ ((emacs
+ (24 3)))
+ "Major mode for editing Dart files" tar
+ ((:url . "https://github.com/bradyt/dart-mode")
+ (:keywords "languages")
+ (:commit . "3bac14200f9f8f8fcebc383087572da5c3823c34"))])
+ (datetime .
+ [(0 10 2)
+ ((emacs
+ (25 1))
+ (extmap
+ (1 1 1)))
+ "Parsing, formatting and matching timestamps" tar
+ ((:url . "https://github.com/doublep/datetime")
+ (:keywords "lisp" "i18n")
+ (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com")
+ (:authors
+ ("Paul Pogonyshev" . "pogonyshev@gmail.com"))
+ (:commit . "b8e5fc2b7338f26ee816a3b03322c585dbd3b686"))])
+ (denote-refs .
+ [(0 1 2)
+ ((emacs
+ (28 1))
+ (denote
+ (1 1 0)))
+ "Show links and backlinks in Denote notes" tar
+ ((:url . "https://codeberg.org/akib/emacs-denote-refs")
+ (:keywords "hypermedia" "outlines" "files")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "9ae49c8770a83eed92c58be45a4c96fa927cbe6f"))])
+ (devhelp .
+ [(1 0)
+ ((emacs
+ (27 1)))
+ "Browse documentation in Devhelp format" tar
+ ((:url . "https://codeberg.org/akib/emacs-devhelp")
+ (:keywords "docs")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "bebdb6a165bdc3bb6b357706d0ce58f57271d137"))])
+ (devil .
+ [(0 6 0)
+ ((emacs
+ (24 4)))
+ "Minor mode for translating key sequences" tar
+ ((:url . "https://github.com/susam/devil")
+ (:keywords "convenience" "abbrev")
+ (:maintainer "Susam Pal" . "susam@susam.net")
+ (:authors
+ ("Susam Pal" . "susam@susam.net"))
+ (:commit . "1985300ce84abd712be93b271b27c3bdb164231d"))])
+ (diff-ansi .
+ [(0 2)
+ ((emacs
+ (27 1)))
+ "Display diff's using alternative diffing tools" tar
+ ((:url . "https://codeberg.org/ideasman42/emacs-diff-ansi")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "71336e614e3150c47c58f99f2df10a3af73370ac"))])
+ (dirvish .
+ [(2 2 7)
+ ((emacs
+ (28 1)))
+ "A modern file manager based on dired mode" tar
+ ((:url . "https://github.com/alexluigit/dirvish")
+ (:keywords "files" "convenience")
+ (:maintainer "Alex Lu" . "https://github.com/alexluigit")
+ (:authors
+ ("Alex Lu" . "https://github.com/alexluigit"))
+ (:commit . "a8e3a4ddcfe07dce284acb6276515bb813a57e14"))])
+ (doc-show-inline .
+ [(0 1)
+ ((emacs
+ (26 2)))
+ "Show doc-strings found in external files" tar
+ ((:url . "https://gitlab.com/ideasman42/emacs-doc-show-inline")
+ (:keywords "convenience")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "1c5837d2a667d977a1bd90ba44ebd911cc660f26"))])
+ (dockerfile-mode .
+ [(1 9)
+ ((emacs
+ (24)))
+ "Major mode for editing Docker's Dockerfiles" tar
+ ((:url . "https://github.com/spotify/dockerfile-mode")
+ (:keywords "docker" "languages" "processes" "tools")
+ (:commit . "7ce17e054eca4d56ca8bc1e4a6a0dbf58efd8d52"))])
+ (dracula-theme .
+ [(1 8 2)
+ ((emacs
+ (24 3)))
+ "Dracula Theme" tar
+ ((:url . "https://github.com/dracula/emacs")
+ (:maintainer "tienne Deparis" . "etienne@depar.is")
+ (:commit . "29d5180f7e34c0c858a520068fb650f705b8cfc2"))])
+ (drupal-mode .
+ [(0 8 1)
+ ((php-mode
+ (1 5 0)))
+ "Advanced minor mode for Drupal development" tar
+ ((:url . "https://github.com/arnested/drupal-mode")
+ (:keywords "programming" "php" "drupal")
+ (:maintainer "Arne Jørgensen" . "arne@arnested.dk")
+ (:authors
+ ("Arne Jørgensen" . "arne@arnested.dk"))
+ (:commit . "f632fa5f140b04260fa23b15ffccbfe5a787b2e2"))])
+ (dslide .
+ [(0 6 2)
+ ((emacs
+ (29 2)))
+ "Domain Specific sLIDEs. Programmable Presentation" tar
+ ((:url . "https://github.com/positron-solutions/dslide")
+ (:keywords "convenience" "org-mode" "presentation" "narrowing")
+ (:maintainer "Positron" . "contact@positron.solutions")
+ (:authors
+ ("Positron" . "contact@positron.solutions"))
+ (:commit . "be47f2dcb939779067f8c77c3493162bcf242b83"))])
+ (eat .
+ [(0 9 4)
+ ((emacs
+ (26 1))
+ (compat
+ (29 1)))
+ "Emulate A Terminal, in a region, in a buffer and in Eshell" tar
+ ((:url . "https://codeberg.org/akib/emacs-eat")
+ (:keywords "terminals" "processes")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "c91451f2d17453c19d3fa76faa4945cbe54e14ce"))])
+ (edit-indirect .
+ [(0 1 13)
+ ((emacs
+ (24 3)))
+ "Edit regions in separate buffers" tar
+ ((:url . "https://github.com/Fanael/edit-indirect")
+ (:maintainer "Fanael Linithien" . "fanael4@gmail.com")
+ (:authors
+ ("Fanael Linithien" . "fanael4@gmail.com"))
+ (:commit . "82a28d8a85277cfe453af464603ea330eae41c05"))])
+ (editorconfig .
+ [(0 11 0)
+ ((emacs
+ (26 1))
+ (nadvice
+ (0 3)))
+ "EditorConfig Emacs Plugin" tar
+ ((:url . "https://github.com/editorconfig/editorconfig-emacs#readme")
+ (:keywords "convenience" "editorconfig")
+ (:maintainer "EditorConfig Team" . "editorconfig@googlegroups.com")
+ (:authors
+ ("EditorConfig Team" . "editorconfig@googlegroups.com"))
+ (:commit . "f1531bab5b57e40759167b7e5db49acbbc09972f"))])
+ (eglot-inactive-regions .
+ [(0 6 5)
+ ((emacs
+ (29 1)))
+ "Highlight inactive code regions with eglot power" tar
+ ((:url . "https://github.com/fargiolas/eglot-inactive-regions")
+ (:maintainer "Filippo Argiolas" . "filippo.argiolas@gmail.com")
+ (:authors
+ ("Filippo Argiolas" . "filippo.argiolas@gmail.com"))
+ (:commit . "3d973b45afbf3afa835abaf3d99c993b5426a596"))])
+ (eldoc-diffstat .
+ [(1 0)
+ ((emacs
+ (29 1)))
+ "Make VCS diffstat available via eldoc" tar
+ ((:url . "https://github.com/kljohann/eldoc-diffstat/")
+ (:keywords "vc" "docs")
+ (:maintainer "Johann Klähn" . "johann@jklaehn.de")
+ (:authors
+ ("Johann Klähn" . "johann@jklaehn.de"))
+ (:commit . "33aa6d7ee5d0e712b112c74ec6e076463b540e9e"))])
+ (elixir-mode .
+ [(2 5 0)
+ ((emacs
+ (25)))
+ "Major mode for editing Elixir files" tar
+ ((:url . "https://github.com/elixir-editors/emacs-elixir")
+ (:keywords "languages" "elixir")
+ (:commit . "00d6580a040a750e019218f9392cf9a4c2dac23a"))])
+ (elpher .
+ [(3 6 5)
+ ((emacs
+ (27 1)))
+ "A friendly gopher and gemini client" tar
+ ((:url . "https://thelambdalab.xyz/elpher")
+ (:keywords "comm" "gopher" "gemini")
+ (:maintainer "Tim Vaughan" . "plugd@thelambdalab.xyz")
+ (:authors
+ ("Tim Vaughan" . "plugd@thelambdalab.xyz"))
+ (:commit . "972a069f240f071a79da23c98d3519df45bb5851"))])
+ (emacsql .
+ [(4 2 0)
+ ((emacs
+ (26 1)))
+ "High-level SQL database front-end" tar
+ ((:url . "https://github.com/magit/emacsql")
+ (:maintainer "Jonas Bernoulli" . "emacs.emacsql@jonas.bernoulli.dev")
+ (:authors
+ ("Christopher Wellons" . "wellons@nullprogram.com"))
+ (:commit . "f111b0acc79eadeeb3c6c1332d943f11fd6932ff"))])
+ (engine-mode .
+ [(2 2 4)
+ ((cl-lib
+ (0 5)))
+ "Define and query search engines" tar
+ ((:url . "https://github.com/hrs/engine-mode")
+ (:maintainer "Harry R. Schwartz" . "hello@harryrschwartz.com")
+ (:authors
+ ("Harry R. Schwartz" . "hello@harryrschwartz.com"))
+ (:commit . "67b68c1a2bff48bad2cc4722598da0f36e3866a9"))])
+ (evil .
+ [(1 15 0)
+ nil "extensible vi layer" tar
+ ((:url . "https://github.com/emacs-evil/evil")
+ (:keywords "emulation" "vim")
+ (:maintainer "Tom Dalziel" . "tom.dalziel@gmail.com")
+ (:commit . "008a6cdb12f15e748979a7d1c2f26c34c84dedbf"))])
+ (evil-anzu .
+ [(0 2)
+ ((evil
+ (1 0 0))
+ (anzu
+ (0 46)))
+ "anzu for evil-mode" tar
+ ((:url . "https://github.com/syohex/emacs-evil-anzu")
+ (:maintainer
+ ("Syohei YOSHIDA" . "syohex@gmail.com")
+ ("Fredrik Bergroth" . "fbergroth@gmail.com"))
+ (:authors
+ ("Syohei YOSHIDA" . "syohex@gmail.com")
+ ("Fredrik Bergroth" . "fbergroth@gmail.com"))
+ (:commit . "5aa524dd2dbccdb607fcea0ea708be44a5cfe730"))])
+ (evil-args .
+ [(1 1)
+ ((evil
+ (1 0 8)))
+ "Motions and text objects for delimited arguments in Evil." tar
+ ((:url . "http://github.com/wcsmith/evil-args")
+ (:keywords "evil" "vim-emulation")
+ (:maintainer "Connor Smith" . "wconnorsmith@gmail.com")
+ (:authors
+ ("Connor Smith" . "wconnorsmith@gmail.com"))
+ (:commit . "2671071a4a57eaee7cc8c27b9e4b6fc60fd2ccd3"))])
+ (evil-escape .
+ [(3 16)
+ ((emacs
+ (24))
+ (evil
+ (1 0 9))
+ (cl-lib
+ (0 5)))
+ "Escape from anything with a customizable key sequence" tar
+ ((:url . "https://github.com/emacsorphanage/evil-escape")
+ (:keywords "convenience" "editing" "evil")
+ (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com")
+ (:authors
+ ("Sylvain Benner" . "sylvain.benner@gmail.com"))
+ (:commit . "3c335a5709b1abb08687960038746b36add465f9"))])
+ (evil-exchange .
+ [(0 41)
+ ((evil
+ (1 2 8))
+ (cl-lib
+ (0 3)))
+ "Exchange text more easily within Evil" tar
+ ((:url . "http://github.com/Dewdrops/evil-exchange")
+ (:keywords "evil" "plugin")
+ (:maintainer "Dewdrops" . "v_v_4474@126.com")
+ (:authors
+ ("Dewdrops" . "v_v_4474@126.com"))
+ (:commit . "47691537815150715e64e6f6ec79be7746c96120"))])
+ (evil-goggles .
+ [(0 0 2)
+ ((emacs
+ (24 4))
+ (evil
+ (1 0 0)))
+ "Add a visual hint to evil operations" tar
+ ((:url . "http://github.com/edkolev/evil-goggles")
+ (:keywords "emulations" "evil" "vim" "visual")
+ (:maintainer "edkolev" . "evgenysw@gmail.com")
+ (:authors
+ ("edkolev" . "evgenysw@gmail.com"))
+ (:commit . "7801d9204cd57d5aec11ef43b15357a431cf025c"))])
+ (evil-iedit-state .
+ [(1 3)
+ ((evil
+ (1 0 9))
+ (iedit
+ (0 9 9 9)))
+ "Evil states to interface iedit mode." tar
+ ((:url . "https://github.com/syl20bnr/evil-iedit-state")
+ (:keywords "convenience" "editing" "evil" "iedit" "mnemonic")
+ (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com")
+ (:authors
+ ("Sylvain Benner" . "sylvain.benner@gmail.com"))
+ (:commit . "44c64c71692e5b2f608ad3e3c537ec0a0e0ea0f8"))])
+ (evil-indent-plus .
+ [(1 0 1)
+ ((evil
+ (0))
+ (cl-lib
+ (0 5)))
+ "Evil textobjects based on indentation" tar
+ ((:url . "http://github.com/TheBB/evil-indent-plus")
+ (:keywords "convenience" "evil")
+ (:maintainer "Eivind Fonn" . "evfonn@gmail.com")
+ (:authors
+ ("Eivind Fonn" . "evfonn@gmail.com"))
+ (:commit . "db8cfd6b6fd51a13054922d8f53f93a481b40544"))])
+ (evil-lisp-state .
+ [(8 2)
+ ((evil
+ (1 0 9))
+ (bind-map
+ (0))
+ (smartparens
+ (1 6 1)))
+ "An evil state to edit Lisp code" tar
+ ((:url . "https://github.com/syl20bnr/evil-lisp-state")
+ (:keywords "convenience" "editing" "evil" "smartparens" "lisp" "mnemonic")
+ (:maintainer "Sylvain Benner" . "sylvain.benner@gmail.com")
+ (:authors
+ ("Sylvain Benner" . "sylvain.benner@gmail.com"))
+ (:commit . "3c65fecd9917a41eaf6460f22187e2323821f3ce"))])
+ (evil-matchit .
+ [(4 0 1)
+ ((emacs
+ (27 1)))
+ "Vim matchit ported to Evil" tar
+ ((:url . "http://github.com/redguardtoo/evil-matchit")
+ (:keywords "matchit" "vim" "evil")
+ (:maintainer "Chen Bin" . "chenbin.sh@gmail.com")
+ (:authors
+ ("Chen Bin" . "chenbin.sh@gmail.com"))
+ (:commit . "84a6d34c1a1282c43c6ccef2ead3eaa41fd1535f"))])
+ (evil-nerd-commenter .
+ [(3 6 1)
+ ((emacs
+ (26 1)))
+ "Comment/uncomment lines efficiently. Like Nerd Commenter in Vim" tar
+ ((:url . "http://github.com/redguardtoo/evil-nerd-commenter")
+ (:keywords "convenience" "evil")
+ (:maintainer "Chen Bin" . "chenbin.sh@gmail.com")
+ (:authors
+ ("Chen Bin" . "chenbin.sh@gmail.com"))
+ (:commit . "3b197a2b559b06a7cf39978704b196f53dac802a"))])
+ (evil-numbers .
+ [(0 7)
+ ((emacs
+ (24 1))
+ (evil
+ (1 2 0)))
+ "Increment/decrement numbers like in VIM" tar
+ ((:url . "http://github.com/juliapath/evil-numbers")
+ (:keywords "convenience" "tools")
+ (:maintainer "Julia Path" . "julia@jpath.de")
+ (:authors
+ ("Michael Markert" . "markert.michael@googlemail.com"))
+ (:commit . "61dde4e3715fd1255df8f87a37d9c8022e909bf4"))])
+ (evil-surround .
+ [(1 0 4)
+ ((evil
+ (1 2 12)))
+ "emulate surround.vim from Vim" tar
+ ((:keywords "emulation" "vi" "evil")
+ (:maintainer
+ ("Tim Harper" . "timcharperatgmaildotcom")
+ ("Vegard ye" . "vegard_oyeathotmaildotcom"))
+ (:authors
+ ("Tim Harper" . "timcharperatgmaildotcom")
+ ("Vegard ye" . "vegard_oyeathotmaildotcom"))
+ (:url . "https://elpa.nongnu.org/nongnu/evil-surround.html")
+ (:commit . "a14856cd811d2ad2cab343d1a2591e68c1e7ba6d"))])
+ (evil-visual-mark-mode .
+ [(0 0 5)
+ ((evil
+ (1 0 9))
+ (dash
+ (2 10)))
+ "Display evil marks on buffer" tar
+ ((:keywords "evil")
+ (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com")
+ (:authors
+ ("Roman Gonzalez" . "romanandreg@gmail.com"))
+ (:url . "https://elpa.nongnu.org/nongnu/evil-visual-mark-mode.html")
+ (:commit . "2bbaaae56ae53e68a8bcc7bc2cfe830a14843b4d"))])
+ (evil-visualstar .
+ [(0 2 0)
+ ((evil
+ (0)))
+ "Starts a * or # search from the visual selection" tar
+ ((:url . "https://github.com/bling/evil-visualstar")
+ (:keywords "evil" "vim" "visualstar")
+ (:commit . "87a5bd845759c5e5508de2e2aed2a99424995d44"))])
+ (exec-path-from-shell .
+ [(2 2)
+ ((emacs
+ (24 4)))
+ "Get environment variables such as $PATH from the shell" tar
+ ((:url . "https://github.com/purcell/exec-path-from-shell")
+ (:keywords "unix" "environment")
+ (:maintainer "Steve Purcell" . "steve@sanityinc.com")
+ (:authors
+ ("Steve Purcell" . "steve@sanityinc.com"))
+ (:commit . "72ede29a0e0467b3b433e8edbee3c79bab005884"))])
+ (extmap .
+ [(1 3)
+ ((emacs
+ (24 4)))
+ "Externally-stored constant mapping for Elisp" tar
+ ((:url . "https://github.com/doublep/extmap")
+ (:keywords "lisp")
+ (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com")
+ (:authors
+ ("Paul Pogonyshev" . "pogonyshev@gmail.com"))
+ (:commit . "c7af95865ef083327d299b86c254ca87fa88a504"))])
+ (flx .
+ [(0 6 2)
+ ((cl-lib
+ (0 3)))
+ "fuzzy matching with good sorting" tar
+ ((:url . "https://github.com/lewang/flx")
+ (:commit . "29e3664b75618847eaaf821713a74eb3c897a124"))])
+ (flx-ido .
+ [(0 6 2)
+ ((flx
+ (0 1))
+ (cl-lib
+ (0 3)))
+ "flx integration for ido" tar
+ ((:url . "https://github.com/lewang/flx")
+ (:commit . "29e3664b75618847eaaf821713a74eb3c897a124"))])
+ (flycheck .
+ [(34 1)
+ ((emacs
+ (26 1)))
+ "On-the-fly syntax checking" tar
+ ((:url . "http://www.flycheck.org")
+ (:keywords "convenience" "languages" "tools")
+ (:maintainer
+ ("Clément Pit-Claudel" . "clement.pitclaudel@live.com")
+ ("fmdkdd" . "fmdkdd@gmail.com")
+ ("Bozhidar Batsov" . "bozhidar@batsov.dev"))
+ (:authors
+ ("Sebastian Wiesner" . "swiesner@lunaryorn.com"))
+ (:commit . "5a9ff918f91e230ae08a6bdce7ec1f107864a5e2"))])
+ (flymake-guile .
+ [(0 5)
+ ((emacs
+ (26 1))
+ (flymake
+ (1 2 1)))
+ "Guile flymake backend" tar
+ ((:keywords "language" "tools")
+ (:maintainer "Distopico" . "distopico@riseup.net")
+ (:authors
+ ("Distopico" . "distopico@riseup.net"))
+ (:url . "https://elpa.nongnu.org/nongnu/flymake-guile.html")
+ (:commit . "eb5e2c0f97639a200d6b709601834b304118b4df"))])
+ (flymake-kondor .
+ [(0 1 3)
+ ((emacs
+ (26 1)))
+ "Linter with clj-kondo" tar
+ ((:url . "https://github.com/turbo-cafe/flymake-kondor")
+ (:commit . "784e57f36812a37e323409b90b935ef3c6920a22"))])
+ (flymake-popon .
+ [(0 5 1)
+ ((emacs
+ (26 1))
+ (flymake
+ (1 2 2))
+ (popon
+ (0 1))
+ (posframe
+ (1 3 2)))
+ "Flymake diagnostics on cursor hover" tar
+ ((:url . "https://codeberg.org/akib/emacs-flymake-popon")
+ (:keywords "convenience")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "99ea813346f3edef7220d8f4faeed2ec69af6060"))])
+ (focus .
+ [(1 0 1)
+ ((emacs
+ (24 3))
+ (cl-lib
+ (0 5)))
+ "Dim the font color of text in surrounding sections" tar
+ ((:url . "http://github.com/larstvei/Focus")
+ (:maintainer "Lars Tveito" . "larstvei@ifi.uio.no")
+ (:authors
+ ("Lars Tveito" . "larstvei@ifi.uio.no"))
+ (:commit . "2507ec4ec5a9402647ef85540669db1815520c15"))])
+ (forth-mode .
+ [(0 2)
+ nil "Programming language mode for Forth" tar
+ ((:url . "http://github.com/larsbrinkhoff/forth-mode")
+ (:keywords "languages" "forth")
+ (:maintainer "Lars Brinkhoff" . "lars@nocrew.org")
+ (:authors
+ ("Lars Brinkhoff" . "lars@nocrew.org"))
+ (:commit . "38d5152011ee67e0cff9d4a5ddfb1f908e5be013"))])
+ (free-keys .
+ [(1 0)
+ ((cl-lib
+ (0 3)))
+ "Show free keybindings for modkeys or prefixes" tar
+ ((:url . "https://github.com/Fuco1/free-keys")
+ (:keywords "convenience")
+ (:maintainer "Matus Goljer" . "matus.goljer@gmail.com")
+ (:authors
+ ("Matus Goljer" . "matus.goljer@gmail.com"))
+ (:commit . "6f9172376af4d399c7853cbdfdd7425348a878f9"))])
+ (gc-buffers .
+ [(1 0)
+ ((emacs
+ (24 1)))
+ "Kill garbage buffers automatically" tar
+ ((:url . "https://codeberg.org/akib/emacs-gc-buffers")
+ (:keywords "internal")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "ce2ea016a67b200862788e81f0ff1f8f7e4e0454"))])
+ (geiser .
+ [(0 31 1)
+ ((emacs
+ (27 1))
+ (project
+ (0 8 1)))
+ "GNU Emacs and Scheme talk to each other" tar
+ ((:url . "https://gitlab.com/emacs-geiser/")
+ (:keywords "languages" "scheme" "geiser")
+ (:maintainer "Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")
+ (:authors
+ ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)"))
+ (:commit . "c034c129cfa7442881f13ae146c87785b367cff5"))])
+ (geiser-chez .
+ [(0 18)
+ ((emacs
+ (26 1))
+ (geiser
+ (0 19)))
+ "Chez and Geiser talk to each other" tar
+ ((:url . "https://gitlab.com/emacs-geiser/chez")
+ (:keywords "languages" "chez" "scheme" "geiser")
+ (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org")
+ (:authors
+ ("Peter" . "craven@gmx.net"))
+ (:commit . "988d9f7e24b8634755cdb7b110e3e399bdb55df3"))])
+ (geiser-chibi .
+ [(0 17)
+ ((emacs
+ (24 4))
+ (geiser
+ (0 18)))
+ "Chibi Scheme's implementation of the geiser protocols" tar
+ ((:url . "https://gitlab.com/emacs-geiser/chibi")
+ (:keywords "languages" "chibi" "scheme" "geiser")
+ (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org")
+ (:authors
+ ("Peter" . "craven@gmx.net"))
+ (:commit . "5a6a5a580ea45cd4974df21629a8d50cbe3d6e99"))])
+ (geiser-chicken .
+ [(0 17)
+ ((emacs
+ (24 4))
+ (geiser
+ (0 19)))
+ "Chicken's implementation of the geiser protocols" tar
+ ((:url . "https://gitlab.com/emacs-geiser/chicken")
+ (:keywords "languages" "chicken" "scheme" "geiser")
+ (:commit . "79a9ac78f4df7c9ec1f918313c543c116dbb8b70"))])
+ (geiser-gambit .
+ [(0 18 1)
+ ((emacs
+ (26 1))
+ (geiser
+ (0 18)))
+ "Gambit's implementation of the geiser protocols" tar
+ ((:url . "https://gitlab.com/emacs-geiser/gambit")
+ (:keywords "languages" "gambit" "scheme" "geiser")
+ (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org")
+ (:commit . "381d74ca5059b44fe3d8b5daf42214019c6d1a88"))])
+ (geiser-gauche .
+ [(0 0 2)
+ ((emacs
+ (26 1))
+ (geiser
+ (0 11 2)))
+ "Gauche scheme support for Geiser" tar
+ ((:url . "https://gitlab.com/emacs-geiser/gauche")
+ (:keywords "languages" "gauche" "scheme" "geiser")
+ (:maintainer "András Simonyi" . "andras.simonyi@gmail.com")
+ (:authors
+ ("András Simonyi" . "andras.simonyi@gmail.com"))
+ (:commit . "9e7ed54e5629f759660569bc7efc3d75dbabbc5f"))])
+ (geiser-guile .
+ [(0 28 3)
+ ((emacs
+ (26 1))
+ (transient
+ (0 3))
+ (geiser
+ (0 28 1)))
+ "Guile and Geiser talk to each other" tar
+ ((:url . "https://gitlab.com/emacs-geiser/guile")
+ (:keywords "languages" "guile" "scheme" "geiser")
+ (:maintainer "Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")
+ (:authors
+ ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)"))
+ (:commit . "a0f111f8dedd31c593c4ed12c0b99745f3c1340f"))])
+ (geiser-kawa .
+ [(0 0 1)
+ ((emacs
+ (26 1))
+ (geiser
+ (0 16)))
+ "Kawa scheme support for Geiser" tar
+ ((:url . "https://gitlab.com/emacs-geiser/kawa")
+ (:maintainer "spellcard199" . "spellcard199@protonmail.com")
+ (:authors
+ ("spellcard199" . "spellcard199@protonmail.com"))
+ (:keywords "languages" "kawa" "scheme" "geiser"))])
+ (geiser-mit .
+ [(0 15)
+ ((emacs
+ (24 4))
+ (geiser
+ (0 18)))
+ "MIT/GNU Scheme's implementation of the geiser protocols" tar
+ ((:url . "https://gitlab.com/emacs-geiser/mit")
+ (:keywords "languages" "mit" "scheme" "geiser")
+ (:maintainer "Jose A Ortega Ruiz" . "jao@gnu.org")
+ (:authors
+ ("Peter" . "craven@gmx.net"))
+ (:commit . "4e90e9ae815e89f3540fb9644e6016c663ef5765"))])
+ (geiser-racket .
+ [(0 16)
+ ((emacs
+ (26 1))
+ (geiser
+ (0 16)))
+ "Support for Racket in Geiser" tar
+ ((:url . "https://gitlab.com/emacs-geiser/racket")
+ (:keywords "languages" "racket" "scheme" "geiser")
+ (:maintainer "Jose Antonio Ortega Ruiz" . "(jao@gnu.org)")
+ (:authors
+ ("Jose Antonio Ortega Ruiz" . "(jao@gnu.org)"))
+ (:commit . "22e56ce80389544d3872cf4beb4008fb514b2218"))])
+ (geiser-stklos .
+ [(1 8)
+ ((emacs
+ (24 4))
+ (geiser
+ (0 16)))
+ "STklos Scheme implementation of the geiser protocols" tar
+ ((:url . "https://gitlab.com/emacs-geiser/stklos")
+ (:keywords "languages" "stklos" "scheme" "geiser")
+ (:maintainer "Jeronimo Pellegrini" . "(j_p@aleph0.info)")
+ (:authors
+ ("Jeronimo Pellegrini" . "(j_p@aleph0.info)"))
+ (:commit . "3358d0cc01436bd8f71a500175db2716e75b2eed"))])
+ (git-modes .
+ [(1 4 4)
+ ((emacs
+ (26 1))
+ (compat
+ (30 0 0 0)))
+ "Major modes for editing Git configuration files" tar
+ ((:url . "https://github.com/magit/git-modes")
+ (:keywords "convenience" "vc" "git")
+ (:maintainer "Jonas Bernoulli" . "emacs.git-modes@jonas.bernoulli.dev")
+ (:authors
+ ("Sebastian Wiesner" . "lunaryorn@gmail.com")
+ ("Rüdiger Sonderfeld" . "ruediger@c-plusplus.net")
+ ("Jonas Bernoulli" . "emacs.git-modes@jonas.bernoulli.dev"))
+ (:commit . "f99010bbeb8b6d8a0819fac0195a2ef0159d08f0"))])
+ (gnosis .
+ [(0 4 10)
+ ((emacs
+ (27 2))
+ (emacsql
+ (4 0 1))
+ (compat
+ (29 1 4 2))
+ (transient
+ (0 7 2)))
+ "Spaced Repetition System" tar
+ ((:url . "https://thanosapollo.org/projects/gnosis")
+ (:keywords "extensions")
+ (:maintainer "Thanos Apollo" . "public@thanosapollo.org")
+ (:authors
+ ("Thanos Apollo" . "public@thanosapollo.org"))
+ (:commit . "42b3f00f88bc6dc8c8b207be7548f29a7777b136"))])
+ (gnu-apl-mode .
+ [(1 5 1)
+ nil "Emacs mode for GNU APL" tar
+ ((:url . "http://www.gnu.org/software/apl/")
+ (:keywords "languages")
+ (:maintainer "Elias Mårtenson" . "lokedhs@gmail.com")
+ (:authors
+ ("Elias Mårtenson" . "lokedhs@gmail.com"))
+ (:commit . "deabf59d2375d4662221f8222e28caeb1be96428"))])
+ (gnu-indent .
+ [(1 0)
+ ((emacs
+ (27 2)))
+ "Indent your code with GNU Indent" tar
+ ((:url . "https://codeberg.org/akib/emacs-why-this")
+ (:keywords "tools" "convenience" "vc")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "6bb82ce89ed93222dd919bc65e0f46ac4aa13479"))])
+ (gnuplot .
+ [(0 8 1)
+ ((emacs
+ (25 1)))
+ "Major-mode and interactive frontend for gnuplot" tar
+ ((:url . "https://github.com/emacs-gnuplot/gnuplot")
+ (:keywords "data" "gnuplot" "plotting")
+ (:maintainer
+ ("Maxime Tréca" . "maxime@gmail.com")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "663a89d263d4f26b996796d01b6a3b783449e0f5"))])
+ (go-mode .
+ [(1 6 0)
+ ((emacs
+ (26 1)))
+ "Major mode for the Go programming language" tar
+ ((:url . "https://github.com/dominikh/go-mode.el")
+ (:keywords "languages" "go")
+ (:commit . "3273fcece5d9ab7edd4f15b2d6bce61f4e5a0666"))])
+ (golden-ratio .
+ [(1 0 1)
+ nil "Automatic resizing of Emacs windows to the golden ratio" tar
+ ((:keywords "window" "resizing")
+ (:maintainer "Roman Gonzalez" . "romanandreg@gmail.com")
+ (:authors
+ ("Roman Gonzalez" . "romanandreg@gmail.com"))
+ (:url . "https://elpa.nongnu.org/nongnu/golden-ratio.html")
+ (:commit . "362ab0ede7ee2bb9fd11aea119b9c22248649c0d"))])
+ (gotham-theme .
+ [(1 1 9)
+ ((emacs
+ (24 1)))
+ "A very dark Emacs color theme" tar
+ ((:url . "https://depp.brause.cc/gotham-theme")
+ (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de")
+ (:authors
+ ("Vasilij Schneidermann" . "mail@vasilij.de"))
+ (:commit . "4b8214df0851bb69b44c3e864568b7e0030a95d2"))])
+ (goto-chg .
+ [(1 7 5)
+ ((emacs
+ (24 1)))
+ "Go to last change" tar
+ ((:url . "https://github.com/emacs-evil/goto-chg")
+ (:keywords "convenience" "matching")
+ (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de")
+ (:authors
+ ("David Andersson" . "l.david.anderssonsverige.nu"))
+ (:commit . "278cd3e6d5107693aa2bb33189ca503f22f227d0"))])
+ (gptel .
+ [(0 9 8)
+ ((emacs
+ (27 1))
+ (transient
+ (0 7 4))
+ (compat
+ (29 1 4 1)))
+ "Interact with ChatGPT or other LLMs" tar
+ ((:url . "https://github.com/karthink/gptel")
+ (:keywords "convenience" "tools")
+ (:maintainer "Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com")
+ (:authors
+ ("Karthik Chikmagalur" . "karthik.chikmagalur@gmail.com"))
+ (:commit . "4c5f7e6953c3e4dac36b4c9cf4b4a2c854febfad"))])
+ (graphql-mode .
+ [(1 0 0)
+ ((emacs
+ (24 3)))
+ "Major mode for editing GraphQL schemas" tar
+ ((:url . "https://github.com/davazp/graphql-mode")
+ (:keywords "languages")
+ (:maintainer "David Vazquez Pua" . "davazp@gmail.com")
+ (:authors
+ ("David Vazquez Pua" . "davazp@gmail.com"))
+ (:commit . "fe8d7e2db5581cd0cb7a69563bc44f0669f76322"))])
+ (gruber-darker-theme .
+ [(0 7)
+ nil "Gruber Darker color theme for Emacs 24." tar
+ ((:url . "http://github.com/rexim/gruber-darker-theme")
+ (:maintainer "Alexey Kutepov" . "reximkut@gmail.com")
+ (:authors
+ ("Alexey Kutepov" . "reximkut@gmail.com"))
+ (:commit . "13e13ea1e2ebd146f279058970835b35de811531"))])
+ (gruvbox-theme .
+ [(1 30 1)
+ ((autothemer
+ (0 2)))
+ "A retro-groove colour theme for Emacs" tar
+ ((:url . "http://github.com/greduan/emacs-theme-gruvbox")
+ (:maintainer "Jason Milkins" . "jasonm23@gmail.com")
+ (:authors
+ ("Jason Milkins" . "jasonm23@gmail.com"))
+ (:commit . "3177b458dcbd5db6135a8d57fd5b765131e4da6a"))])
+ (guru-mode .
+ [(1 0)
+ nil "Become an Emacs guru" tar
+ ((:url . "https://github.com/bbatsov/guru-mode")
+ (:keywords "convenience")
+ (:commit . "3274661e8e4b51455dfc8d8e08c64605463e62f2"))])
+ (haml-mode .
+ [(3 2 1)
+ ((emacs
+ (24))
+ (cl-lib
+ (0 5)))
+ "Major mode for editing Haml files" tar
+ ((:url . "https://github.com/nex3/haml-mode")
+ (:keywords "markup" "languages" "html")
+ (:commit . "45a0b23db0b8f827c78f7749457f3427263e6ffd"))])
+ (haskell-mode .
+ [(17 5)
+ ((emacs
+ (25 1)))
+ "A Haskell editing mode" tar
+ ((:url . "https://github.com/haskell/haskell-mode")
+ (:keywords "haskell" "cabal" "ghc" "repl" "languages")
+ (:commit . "8d0f44bfe2a9ab6b0969c9bafb75089f315ff5ae"))])
+ (haskell-tng-mode .
+ [(0 0 1)
+ ((emacs
+ (26 1)))
+ "Major mode for editing Haskell" tar
+ ((:url . "https://gitlab.com/tseenshe/haskell-tng-mode")
+ (:keywords "languages")
+ (:commit . "59640ceec33cd4df37096289e11ff6f4b876be03"))])
+ (haskell-ts-mode .
+ [(1)
+ ((emacs
+ (29 3)))
+ "A treesit based major mode for haskell" tar
+ ((:url . "https://codeberg.org/pranshu/haskell-ts-mode")
+ (:keywords "languages" "haskell")
+ (:maintainer "Pranshu Sharma" . "pranshusharma366atgmail")
+ (:authors
+ ("Pranshu Sharma" . "pranshusharma366atgmail"))
+ (:commit . "58d158bef475536e78e2a145f2029c49924fb19a"))])
+ (helm .
+ [(4 0 2)
+ ((helm-core
+ (4 0 2))
+ (wfnames
+ (1 2)))
+ "Helm is an Emacs incremental and narrowing framework" tar
+ ((:url . "https://emacs-helm.github.io/helm/")
+ (:keywords "helm" "convenience" "files" "buffers" "grep" "completion" "lisp" "matching" "tools" "help")
+ (:maintainer "Thierry Volpiatto" . "thievol@posteo.net")
+ (:authors
+ ("Thierry Volpiatto" . "thievol@posteo.net"))
+ (:commit . "af3a6a3d842c350b469a735b31ee00bd22fedcc9"))])
+ (helm-core .
+ [(4 0 2)
+ ((emacs
+ (25 1))
+ (async
+ (1 9 9)))
+ "Development files for Helm" tar
+ ((:url . "https://emacs-helm.github.io/helm/")
+ (:maintainer "Thierry Volpiatto" . "thievol@posteo.net")
+ (:authors
+ ("Thierry Volpiatto" . "thievol@posteo.net"))
+ (:commit . "af3a6a3d842c350b469a735b31ee00bd22fedcc9"))])
+ (hideshowvis .
+ [(0 8)
+ ((emacs
+ (24)))
+ "Fringe markers for regions foldable by hideshow.el" tar
+ ((:url . "https://github.com/sheijk/hideshowvis")
+ (:maintainer "Jan Rehders" . "jan@sheijk.net")
+ (:authors
+ ("Jan Rehders" . "jan@sheijk.net"))
+ (:commit . "33e693dc6098825a5d2255707a2961a47d140b6c"))])
+ (highlight-parentheses .
+ [(2 2 2)
+ ((emacs
+ (24 3)))
+ "Highlight surrounding parentheses" tar
+ ((:url . "https://sr.ht/~tsdh/highlight-parentheses.el/")
+ (:keywords "faces" "matching")
+ (:maintainer "Tassilo Horn" . "tsdh@gnu.org")
+ (:authors
+ ("Nikolaj Schumacher" . "bugs*nschumde"))
+ (:commit . "965b18dd69eff4457e17c9e84b3cbfdbfca2ddfb"))])
+ (hl-block-mode .
+ [(0 2)
+ ((emacs
+ (26 1)))
+ "Highlighting nested blocks" tar
+ ((:url . "https://codeberg.org/ideasman42/emacs-hl-block-mode")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "760e02b5fd66812e701c12292a1f00bde3c1c46c"))])
+ (hl-column .
+ [(1 0)
+ ((emacs
+ (24 1)))
+ "Highlight the current column" tar
+ ((:url . "https://codeberg.org/akib/emacs-hl-column")
+ (:keywords "convenience")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "2d3a3f551b52c07a11b9ea0f842ef39915911c55"))])
+ (htmlize .
+ [(1 58)
+ ((emacs
+ (25 1)))
+ "Convert buffer text and decorations to HTML." tar
+ ((:url . "https://github.com/hniksic/emacs-htmlize")
+ (:keywords "hypermedia" "extensions")
+ (:maintainer "Hrvoje Niksic" . "hniksic@gmail.com")
+ (:authors
+ ("Hrvoje Niksic" . "hniksic@gmail.com"))
+ (:commit . "5d2751c4ca101fa0884ce8662f5566736f8257fe"))])
+ (hyperdrive .
+ [(0 5 2)
+ ((emacs
+ (28 1))
+ (map
+ (3 0))
+ (compat
+ (30 0 0 0))
+ (org
+ (9 7 6))
+ (plz
+ (0 9 1))
+ (persist
+ (0 6 1))
+ (taxy-magit-section
+ (0 14))
+ (transient
+ (0 8 0)))
+ "P2P filesystem" tar
+ ((:url . "https://git.sr.ht/~ushin/hyperdrive.el")
+ (:maintainer "Joseph Turner" . "~ushin/ushin@lists.sr.ht")
+ (:authors
+ ("Joseph Turner" . "joseph@ushin.org"))
+ (:commit . "4dceb8e88160bd28e31f4b56f1e5c01138c8fcdc"))])
+ (hyperdrive-org-transclusion .
+ [(0 3 1)
+ ((emacs
+ (28 1))
+ (hyperdrive
+ (0 4 2))
+ (org-transclusion
+ (1 4 0)))
+ "Tranclude hyperdrive content" tar
+ ((:url . "https://git.sr.ht/~ushin/hyperdrive-org-transclusion")
+ (:maintainer "Joseph Turner" . "~ushin/ushin@lists.sr.ht")
+ (:authors
+ ("Joseph Turner" . "joseph@ushin.org"))
+ (:commit . "25570c6e4b90dce0858b80b7f557db19744b3955"))])
+ (idle-highlight-mode .
+ [(1 1 4)
+ ((emacs
+ (27 1)))
+ "Highlight the word the point is on" tar
+ ((:url . "https://codeberg.org/ideasman42/emacs-idle-highlight-mode")
+ (:keywords "convenience")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:commit . "8ded8426e9fb6e2637c25d52184f6333dfa157ad"))])
+ (idris-mode .
+ [(1 1 0)
+ ((emacs
+ (24))
+ (prop-menu
+ (0 1))
+ (cl-lib
+ (0 5)))
+ "Major mode for editing Idris code" tar
+ ((:url . "https://github.com/idris-hackers/idris-mode")
+ (:keywords "languages")
+ (:commit . "f7f12348cedb7eb0e3bdd5f7d7a247f04792f3dc"))])
+ (iedit .
+ [(0 9 9 9 9)
+ nil "Edit multiple regions in the same way simultaneously." tar
+ ((:url . "https://github.com/victorhge/iedit")
+ (:keywords "occurrence" "region" "simultaneous" "refactoring")
+ (:maintainer "Victor Ren" . "victorhge@gmail.com")
+ (:authors
+ ("Victor Ren" . "victorhge@gmail.com"))
+ (:commit . "699e179dac18c78698cba1a2052bee6f0bbc6bf7"))])
+ (inf-clojure .
+ [(3 2 1)
+ ((emacs
+ (25 1))
+ (clojure-mode
+ (5 11)))
+ "Run an external Clojure process in an Emacs buffer" tar
+ ((:url . "http://github.com/clojure-emacs/inf-clojure")
+ (:keywords "processes" "comint" "clojure")
+ (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev")
+ (:commit . "151b20ba9d3ae39b88f91aecbab98bd5a5215f1a"))])
+ (inf-ruby .
+ [(2 9 0)
+ ((emacs
+ (26 1)))
+ "Run a Ruby process in a buffer" tar
+ ((:url . "http://github.com/nonsequitur/inf-ruby")
+ (:keywords "languages" "ruby")
+ (:maintainer "Dmitry Gutov" . "dmitry@gutov.dev")
+ (:authors
+ ("Cornelius Mika" . "cornelius.mika@gmail.com")
+ ("Dmitry Gutov" . "dgutov@yandex.ru")
+ ("Kyle Hargraves" . "pd@krh.me"))
+ (:commit . "b8076aad10dfb0ba1e3a8b0d39c2b370dbe96ab0"))])
+ (inkpot-theme .
+ [(0 1)
+ ((emacs
+ (24 1)))
+ "A port of vim's inkpot theme" tar
+ ((:url . "https://codeberg.com/ideasman42/emacs-inkpot-theme")
+ (:maintainer "Sarah Iovan" . "sarah@hwaetageek.com")
+ (:authors
+ ("Sarah Iovan" . "sarah@hwaetageek.com")
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "de745de9ab7f67431a5ce493a63be68d408ec40e"))])
+ (iwindow .
+ [(1 1)
+ ((emacs
+ (24 3))
+ (seq
+ (2 23))
+ (compat
+ (28 1 2 2)))
+ "Interactively manipulate windows" tar
+ ((:url . "https://codeberg.org/akib/emacs-iwindow")
+ (:keywords "frames")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "3f43991f747edcf7ed5782e7b2f68dab24574ae0"))])
+ (j-mode .
+ [(2 0 1)
+ nil "Major mode for editing J programs" tar
+ ((:url . "http://github.com/ldbeth/j-mode")
+ (:keywords "j" "langauges")
+ (:commit . "65753691027760178f60efa2dec850d372ae931b"))])
+ (jade-mode .
+ [(1 0 1)
+ nil "Major mode for editing .jade files" tar
+ ((:url . "https://github.com/brianc/jade-mode")
+ (:keywords "languages")
+ (:commit . "dad17dc86c93401646802a639a98dd2ec875db6f"))])
+ (jinja2-mode .
+ [(0 3)
+ nil "A major mode for jinja2" tar
+ ((:url . "https://elpa.nongnu.org/nongnu/jinja2-mode.html")
+ (:commit . "a598357069a68b0ac2bf128c19edd8e899084cdc"))])
+ (julia-mode .
+ [(1 0 2)
+ ((emacs
+ (26 1)))
+ "Major mode for editing Julia source code" tar
+ ((:url . "https://github.com/JuliaEditorSupport/julia-emacs")
+ (:keywords "languages")
+ (:commit . "0f4d74f9049df28e2f522733141bfc5b7a0f69a3"))])
+ (keycast .
+ [(1 4 2)
+ ((emacs
+ (28 1))
+ (compat
+ (30 0 2 0)))
+ "Show current command and its binding" tar
+ ((:url . "https://github.com/tarsius/keycast")
+ (:keywords "multimedia")
+ (:maintainer "Jonas Bernoulli" . "emacs.keycast@jonas.bernoulli.dev")
+ (:authors
+ ("Jonas Bernoulli" . "emacs.keycast@jonas.bernoulli.dev"))
+ (:commit . "df329db48c22a3905d540c4240ac65c7b45f51dd"))])
+ (kotlin-mode .
+ [(2 0 0)
+ ((emacs
+ (24 3)))
+ "Major mode for kotlin" tar
+ ((:keywords "languages")
+ (:maintainer "Shodai Yokoyama" . "(quantumcars@gmail.com)")
+ (:authors
+ ("Shodai Yokoyama" . "(quantumcars@gmail.com)"))
+ (:url . "https://elpa.nongnu.org/nongnu/kotlin-mode.html")
+ (:commit . "d92c3b773473e9fe15f61f6177e4fbf097aadd05"))])
+ (llama .
+ [(0 6 2)
+ ((emacs
+ (26 1))
+ (compat
+ (30 0 2 0)))
+ "Compact syntax for short lambda" tar
+ ((:url . "https://github.com/tarsius/llama")
+ (:keywords "extensions")
+ (:commit . "48e5bc4919a4a29665362832d59ade8e248b0c3e"))])
+ (logview .
+ [(0 19 2)
+ ((emacs
+ (25 1))
+ (datetime
+ (0 8))
+ (extmap
+ (1 0))
+ (compat
+ (29)))
+ "Major mode for viewing log files" tar
+ ((:url . "https://github.com/doublep/logview")
+ (:keywords "files" "tools")
+ (:maintainer "Paul Pogonyshev" . "pogonyshev@gmail.com")
+ (:authors
+ ("Paul Pogonyshev" . "pogonyshev@gmail.com"))
+ (:commit . "e9b40730c6abea7d1e0235fa5ba790d175b008ef"))])
+ (loopy .
+ [(0 14 0)
+ ((emacs
+ (27 1))
+ (map
+ (3 3 1))
+ (seq
+ (2 22))
+ (compat
+ (29 1 3))
+ (stream
+ (2 4 0)))
+ "A looping macro" tar
+ ((:url . "https://github.com/okamsn/loopy")
+ (:keywords "extensions")
+ (:commit . "36f76980ea52a31a4c7682f7bd26c4baa32a1d4c"))])
+ (loopy-dash .
+ [(0 13 0)
+ ((emacs
+ (25 1))
+ (loopy
+ (0 13 0))
+ (dash
+ (2 19)))
+ "Dash destructuring for `loopy'" tar
+ ((:url . "https://github.com/okamsn/loopy")
+ (:keywords "extensions")
+ (:commit . "56c8413dbcffef2b1a0896d53584296619cb1504"))])
+ (lorem-ipsum .
+ [(0 4)
+ nil "Insert dummy pseudo Latin text" tar
+ ((:url . "https://github.com/jschaf/emacs-lorem-ipsum")
+ (:keywords "tools" "language" "convenience")
+ (:maintainer "Joe Schafer" . "(joe@jschaf.com)")
+ (:authors
+ ("Jean-Philippe Theberge" . "(jphil21@sourceforge.net)"))
+ (:commit . "4e87a899868e908a7a9e1812831d76c8d072f885"))])
+ (lua-mode .
+ [(20221027)
+ ((emacs
+ (24 3)))
+ "a major-mode for editing Lua scripts" tar
+ ((:url . "https://immerrr.github.io/lua-mode")
+ (:keywords "languages" "processes" "tools")
+ (:maintainer
+ ("2011-2013 immerrr" . "immerrr+lua@gmail.com")
+ ("2010-2011 Reuben Thomas" . "rrt@sc3d.org")
+ ("2006 Juergen Hoetzel" . "juergen@hoetzel.info")
+ ("2001 Christian Vogler" . "cvogler@gradient.cis.upenn.edu")
+ ("1997 Bret Mogilefsky starting from" . "mogul-lua@gelatinous.com")
+ ("tcl-mode by Gregor Schmid" . "schmid@fb3-s7.math.tu-berlin.de")
+ ("Paul Du Bois and" . "pld-lua@gelatinous.com")
+ ("Aaron Smith" . "aaron-lua@gelatinous.com"))
+ (:authors
+ ("2011-2013 immerrr" . "immerrr+lua@gmail.com")
+ ("2010-2011 Reuben Thomas" . "rrt@sc3d.org")
+ ("2006 Juergen Hoetzel" . "juergen@hoetzel.info")
+ ("2001 Christian Vogler" . "cvogler@gradient.cis.upenn.edu")
+ ("1997 Bret Mogilefsky starting from" . "mogul-lua@gelatinous.com")
+ ("tcl-mode by Gregor Schmid" . "schmid@fb3-s7.math.tu-berlin.de")
+ ("Paul Du Bois and" . "pld-lua@gelatinous.com")
+ ("Aaron Smith" . "aaron-lua@gelatinous.com"))
+ (:commit . "1cb83e691627fb92290d452cb08b6c5f73fe19b6"))])
+ (macrostep .
+ [(0 9 5)
+ ((cl-lib
+ (0 5))
+ (compat
+ (29)))
+ "Interactive macro expander" tar
+ ((:url . "https://github.com/emacsorphanage/macrostep")
+ (:keywords "lisp" "languages" "macro" "debugging")
+ (:maintainer "Jeremy Bryant" . "jb@jeremybryant.net")
+ (:authors
+ ("Jon Oddie" . "j.j.oddie@gmail.com"))
+ (:commit . "8e8487712d150178be7297604d0f47fd036a6d8d"))])
+ (magit .
+ [(4 3 1)
+ ((emacs
+ (27 1))
+ (compat
+ (30 0 2 0))
+ (llama
+ (0 6 1))
+ (magit-section
+ (4 3 1))
+ (seq
+ (2 24))
+ (transient
+ (0 8 5))
+ (with-editor
+ (3 4 3)))
+ "A Git porcelain inside Emacs" tar
+ ((:url . "https://github.com/magit/magit")
+ (:keywords "git" "tools" "vc")
+ (:maintainer
+ ("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev")
+ ("Kyle Meyer" . "kyle@kyleam.com"))
+ (:authors
+ ("Marius Vollmer" . "marius.vollmer@gmail.com")
+ ("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev"))
+ (:commit . "28d272ce0bcecc2e312d22ed15a48ad4cea564eb"))])
+ (magit-section .
+ [(4 3 1)
+ ((emacs
+ (27 1))
+ (compat
+ (30 0 2 0))
+ (llama
+ (0 6 1))
+ (seq
+ (2 24)))
+ "Sections for read-only buffers" tar
+ ((:url . "https://github.com/magit/magit")
+ (:keywords "tools")
+ (:maintainer "Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev")
+ (:authors
+ ("Jonas Bernoulli" . "emacs.magit@jonas.bernoulli.dev"))
+ (:commit . "28d272ce0bcecc2e312d22ed15a48ad4cea564eb"))])
+ (markdown-mode .
+ [(2 7)
+ ((emacs
+ (27 1)))
+ "Major mode for Markdown-formatted text" tar
+ ((:url . "https://jblevins.org/projects/markdown-mode/")
+ (:keywords "markdown" "github flavored markdown" "itex")
+ (:maintainer "Jason R. Blevins" . "jblevins@xbeta.org")
+ (:authors
+ ("Jason R. Blevins" . "jblevins@xbeta.org"))
+ (:commit . "1c7aecba67cc478ca3f6bd7899dc06956e4762f4"))])
+ (mastodon .
+ [(2 0 0)
+ ((emacs
+ (28 1))
+ (persist
+ (0 4))
+ (tp
+ (0 7)))
+ "Client for fediverse services using the Mastodon API" tar
+ ((:url . "https://codeberg.org/martianh/mastodon.el")
+ (:maintainer "Marty Hiatt" . "mousebot@disroot.org")
+ (:authors
+ ("Johnson Denen" . "johnson.denen@gmail.com")
+ ("Marty Hiatt" . "mousebot@disroot.org"))
+ (:commit . "30091255352c891b6054a15e428927b2a45abdae"))])
+ (material-theme .
+ [(2015)
+ ((emacs
+ (24 1)))
+ "A Theme based on the colors of the Google Material Design" tar
+ ((:url . "http://github.com/cpaulik/emacs-material-theme")
+ (:keywords "themes")
+ (:maintainer "Christoph Paulik" . "cpaulik@gmail.com")
+ (:authors
+ ("Christoph Paulik" . "cpaulik@gmail.com"))
+ (:commit . "fad77e3658f54d36a11d59d71f04ae07450a7785"))])
+ (mentor .
+ [(0 5)
+ ((emacs
+ (25 1))
+ (xml-rpc
+ (1 6 15))
+ (seq
+ (1 11))
+ (async
+ (1 9 3))
+ (url-scgi
+ (0 7)))
+ "Frontend for the rTorrent bittorrent client" tar
+ ((:url . "https://github.com/skangas/mentor")
+ (:keywords "comm" "processes" "bittorrent")
+ (:maintainer "Stefan Kangas" . "stefankangas@gmail.com")
+ (:authors
+ ("Stefan Kangas" . "stefankangas@gmail.com"))
+ (:commit . "480602f2ec5467aa2418ee98b328fb85d3b58d0c"))])
+ (meow .
+ [(1 5 0)
+ ((emacs
+ (27 1)))
+ "Yet Another modal editing" tar
+ ((:url . "https://www.github.com/DogLooksGood/meow")
+ (:keywords "convenience" "modal-editing")
+ (:commit . "ebf7ebb5eb3ac7bb3cfaca9c32d9063f385aee9a"))])
+ (minibar .
+ [(0 3)
+ ((emacs
+ (27 2)))
+ "Modular status bar in minibuffer" tar
+ ((:url . "https://codeberg.org/akib/emacs-minibar")
+ (:keywords "calendar" "hardware")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "22831489d3bbc22aef315c0f003bf3756b8889fa"))])
+ (moe-theme .
+ [(1 1 0)
+ nil "A colorful eye-candy theme. Moe, moe, kyun!" tar
+ ((:url . "https://github.com/kuanyui/moe-theme.el")
+ (:keywords "themes")
+ (:maintainer "kuanyui" . "azazabc123@gmail.com")
+ (:authors
+ ("kuanyui" . "azazabc123@gmail.com"))
+ (:commit . "0a8ca29701170ea307a7f46d868c53bbce02f3c3"))])
+ (monokai-theme .
+ [(3 5 3)
+ nil "A fruity color theme for Emacs." tar
+ ((:url . "http://github.com/oneKelvinSmith/monokai-emacs")
+ (:maintainer "Kelvin Smith" . "oneKelvinSmith@gmail.com")
+ (:authors
+ ("Kelvin Smith" . "oneKelvinSmith@gmail.com"))
+ (:commit . "1143c072f5153ae1a69807e5e8af163069b947d2"))])
+ (mpv .
+ [(0 2 0)
+ ((cl-lib
+ (0 5))
+ (emacs
+ (25 1))
+ (json
+ (1 3))
+ (org
+ (8 0)))
+ "control mpv for easy note-taking" tar
+ ((:url . "https://github.com/kljohann/mpv.el")
+ (:keywords "tools" "multimedia")
+ (:maintainer "Johann Klähn" . "johann@jklaehn.de")
+ (:authors
+ ("Johann Klähn" . "johann@jklaehn.de"))
+ (:commit . "4fd8baa508dbc1a6b42b4e40292c0dbb0f19c9b9"))])
+ (multiple-cursors .
+ [(1 5 0)
+ ((cl-lib
+ (0 5)))
+ "Multiple cursors for emacs." tar
+ ((:url . "https://github.com/magnars/multiple-cursors.el")
+ (:keywords "editing" "cursors")
+ (:maintainer "Magnar Sveen" . "magnars@gmail.com")
+ (:authors
+ ("Magnar Sveen" . "magnars@gmail.com"))
+ (:commit . "89f1a8df9b1fc721b1672b4c7b6d3ab451e7e3ef"))])
+ (nasm-mode .
+ [(1 1 1)
+ ((emacs
+ (24 3)))
+ "NASM x86 assembly major mode" tar
+ ((:url . "https://github.com/skeeto/nasm-mode")
+ (:maintainer "Christopher Wellons" . "wellons@nullprogram.com")
+ (:authors
+ ("Christopher Wellons" . "wellons@nullprogram.com"))
+ (:commit . "d990ed94d902b74a5c834fb567e03307607cee45"))])
+ (nginx-mode .
+ [(1 1 10)
+ nil "major mode for editing nginx config files" tar
+ ((:keywords "languages" "nginx")
+ (:maintainer "Andrew J Cosgriff" . "andrew@cosgriff.name")
+ (:authors
+ ("Andrew J Cosgriff" . "andrew@cosgriff.name"))
+ (:url . "https://elpa.nongnu.org/nongnu/nginx-mode.html")
+ (:commit . "c4ac5de975d65c84893a130a470af32a48b0b66c"))])
+ (nix-mode .
+ [(1 5 0)
+ ((emacs
+ (25 1))
+ (magit-section
+ (0))
+ (transient
+ (0 3)))
+ "Major mode for editing .nix files" tar
+ ((:url . "https://github.com/NixOS/nix-mode")
+ (:keywords "nix" "languages" "tools" "unix")
+ (:maintainer "Matthew Bauer" . "mjbauer95@gmail.com")
+ (:commit . "54e5626829168e22126b233e079f04dff3c71b90"))])
+ (oblivion-theme .
+ [(0 1)
+ ((emacs
+ (24 1)))
+ "A port of GEdit oblivion theme" tar
+ ((:url . "https://gitlab.com/ideasman42/emacs-oblivion-theme")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "3a1d67637ea4a6099a62de45842b8c5e4440ede4"))])
+ (opam-switch-mode .
+ [(1 7)
+ ((emacs
+ (25 1)))
+ "Select OCaml opam switches via a menu" tar
+ ((:url . "https://github.com/ProofGeneral/opam-switch-mode")
+ (:maintainer nil . "proof-general-maintainers@groupes.renater.fr")
+ (:commit . "71612b9a307c640d2fa662b266787647a3a5075a"))])
+ (org-auto-tangle .
+ [(0 6 0)
+ ((emacs
+ (24 1))
+ (async
+ (1 9 3)))
+ "Automatically and Asynchronously tangles org files on save" tar
+ ((:url . "https://github.com/yilkalargaw/org-auto-tangle")
+ (:keywords "outlines")
+ (:maintainer "Yilkal Argaw" . "yilkalargawworkneh@gmail.com")
+ (:authors
+ ("Yilkal Argaw" . "yilkalargawworkneh@gmail.com"))
+ (:commit . "2494a6f78c9db5311123abc7cad119851a29a55c"))])
+ (org-contrib .
+ [(0 6)
+ ((emacs
+ (25 1))
+ (org
+ (9 4 6)))
+ "Unmaintained add-ons for Org-mode" tar
+ ((:url . "https://git.sr.ht/~bzg/org-contrib")
+ (:keywords "org")
+ (:maintainer "Bastien Guerry" . "bzg@gnu.org")
+ (:authors
+ ("Bastien Guerry" . "bzg@gnu.org"))
+ (:commit . "0e65be83e4b41c17a5b9096c9055c1601b26a23d"))])
+ (org-drill .
+ [(2 7 0)
+ ((emacs
+ (25 3))
+ (seq
+ (2 14))
+ (org
+ (9 2 4))
+ (persist
+ (0 3)))
+ "Self-testing using spaced repetition" tar
+ ((:url . "https://gitlab.com/phillord/org-drill/issues")
+ (:keywords "games" "outlines" "multimedia")
+ (:maintainer "Phillip Lord" . "phillip.lord@russet.org.uk")
+ (:authors
+ ("Paul Sexton" . "eeeickythump@gmail.com"))
+ (:commit . "4c114489e682e514e79701045d541ab6f3dc3fb4"))])
+ (org-journal .
+ [(2 2 0)
+ ((emacs
+ (25 1))
+ (org
+ (9 1)))
+ "a simple org-mode based journaling mode" tar
+ ((:url . "http://github.com/bastibe/org-journal")
+ (:commit . "18df4d5ae5e15580df42562c143d007c6d28d75f"))])
+ (org-mime .
+ [(0 3 4)
+ ((emacs
+ (27 1)))
+ "org html export for text/html MIME emails" tar
+ ((:url . "http://github.com/org-mime/org-mime")
+ (:keywords "mime" "mail" "email" "html")
+ (:maintainer "Chen Bin" . "chenbin.sh@gmail.com")
+ (:commit . "90aa9081ec00a1705552434cb45ff223aa9f8711"))])
+ (org-present .
+ [(0 1)
+ ((org
+ (7)))
+ "Minimalist presentation minor-mode for Emacs org-mode." tar
+ ((:url . "https://github.com/rlister/org-present")
+ (:commit . "75ac0cab2aee6785d184e65bf7abc6d5e55e05d6"))])
+ (org-superstar .
+ [(1 5 1)
+ ((org
+ (9 1 9))
+ (emacs
+ (26 1)))
+ "Prettify headings and plain lists in Org mode" tar
+ ((:url . "https://github.com/integral-dw/org-superstar-mode")
+ (:keywords "faces" "outlines")
+ (:maintainer "D. Williams" . "d.williams@posteo.net")
+ (:authors
+ ("D. Williams" . "d.williams@posteo.net"))
+ (:commit . "03be6c0a3081c46a59b108deb8479ee24a6d86c0"))])
+ (org-transclusion-http .
+ [(0 4)
+ ((emacs
+ (28 1))
+ (org-transclusion
+ (1 4 0))
+ (plz
+ (0 7 2)))
+ "Transclude over HTTP" tar
+ ((:url . "https://git.sr.ht/~ushin/org-transclusion-http")
+ (:maintainer "Joseph Turner" . "~ushin/ushin@lists.sr.ht")
+ (:authors
+ ("Joseph Turner" . "firstnameatushin.org"))
+ (:commit . "a764f05a9eaeca002c76b85d090ca6b036e9dbaf"))])
+ (org-tree-slide .
+ [(2 8 22)
+ ((emacs
+ (25 2)))
+ "A presentation tool for org-mode" tar
+ ((:url . "https://github.com/takaxp/org-tree-slide")
+ (:keywords "convenience" "org-mode" "presentation" "narrowing")
+ (:maintainer "Takaaki ISHIKAWA" . "takaxpatieeedotorg")
+ (:authors
+ ("Takaaki ISHIKAWA" . "takaxpatieeedotorg"))
+ (:commit . "941e7e6cb8a5a0b193345263ed912cceecae1887"))])
+ (orgit .
+ [(2 0 1)
+ ((emacs
+ (26 1))
+ (compat
+ (30 0 2 0))
+ (magit
+ (4 3 1))
+ (org
+ (9 7 11)))
+ "Support for Org links to Magit buffers" tar
+ ((:url . "https://github.com/magit/orgit")
+ (:keywords "hypermedia" "vc")
+ (:maintainer "Jonas Bernoulli" . "emacs.orgit@jonas.bernoulli.dev")
+ (:authors
+ ("Jonas Bernoulli" . "emacs.orgit@jonas.bernoulli.dev"))
+ (:commit . "6ad0dc35c8df54fae4ef27e5145760e22fbbf890"))])
+ (p4-16-mode .
+ [(0 3)
+ nil "Support for the P4_16 programming language" tar
+ ((:keywords "languages" "p4_16")
+ (:maintainer "Soham S Gumaste" . "sohamg2@gmail.com")
+ (:authors
+ ("Soham S Gumaste" . "sohamg2@gmail.com"))
+ (:url . "https://elpa.nongnu.org/nongnu/p4-16-mode.html")
+ (:commit . "794dd0056b4ca736ae5ecb39072547f22a006137"))])
+ (package-lint .
+ [(0 25)
+ ((emacs
+ (24 4))
+ (let-alist
+ (1 0 6)))
+ "A linting library for elisp package authors" tar
+ ((:url . "https://github.com/purcell/package-lint")
+ (:keywords "lisp")
+ (:maintainer
+ ("Steve Purcell" . "steve@sanityinc.com")
+ ("Fanael Linithien" . "fanael4@gmail.com"))
+ (:authors
+ ("Steve Purcell" . "steve@sanityinc.com")
+ ("Fanael Linithien" . "fanael4@gmail.com"))
+ (:commit . "6170c1e5b79f9b9f606ab17ab4d9ffb9bce3ebde"))])
+ (pacmacs .
+ [(0 1 1)
+ ((emacs
+ (24 4))
+ (dash
+ (2 18 0)))
+ "Pacman for Emacs" tar
+ ((:url . "http://github.com/codingteam/pacmacs.el")
+ (:maintainer "Alexey Kutepov" . "reximkut@gmail.com")
+ (:authors
+ ("Codingteam" . "codingteam@conference.jabber.ru"))
+ (:commit . "071d008ebd734f469b87597cbdd34139a92e5308"))])
+ (page-break-lines .
+ [(0 15)
+ ((emacs
+ (24 4)))
+ "Display ^L page breaks as tidy horizontal lines" tar
+ ((:url . "https://github.com/purcell/page-break-lines")
+ (:keywords "convenience" "faces")
+ (:maintainer "Steve Purcell" . "steve@sanityinc.com")
+ (:authors
+ ("Steve Purcell" . "steve@sanityinc.com"))
+ (:commit . "c4283f580fa4feeb9abcaebb99709007db0a3159"))])
+ (paredit .
+ [(26)
+ nil "minor mode for editing parentheses" tar
+ ((:keywords "lisp")
+ (:maintainer "Taylor R. Campbell" . "campbell@paredit.org")
+ (:authors
+ ("Taylor R. Campbell" . "campbell@paredit.org"))
+ (:url . "https://elpa.nongnu.org/nongnu/paredit.html")
+ (:commit . "72cc1f6055321a53021186b86d2f825167b81478"))])
+ (parseclj .
+ [(1 1 1)
+ ((emacs
+ (25)))
+ "Clojure/EDN parser" tar
+ ((:keywords "lisp" "clojure" "edn" "parser")
+ (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net")
+ (:authors
+ ("Arne Brasseur" . "arne@arnebrasseur.net"))
+ (:url . "https://elpa.nongnu.org/nongnu/parseclj.html")
+ (:commit . "6af22372e0fe14df882dd300b22b12ba2d7e00b0"))])
+ (parseedn .
+ [(1 2 1)
+ ((emacs
+ (26))
+ (parseclj
+ (1 1 1))
+ (map
+ (2)))
+ "Clojure/EDN parser" tar
+ ((:url . "http://www.github.com/clojure-emacs/parseedn")
+ (:keywords "lisp" "clojure" "edn" "parser")
+ (:maintainer "Arne Brasseur" . "arne@arnebrasseur.net")
+ (:authors
+ ("Arne Brasseur" . "arne@arnebrasseur.net"))
+ (:commit . "3407e4530a367b6c2b857dae261cdbb67a440aaa"))])
+ (pcmpl-args .
+ [(0 1 3)
+ ((emacs
+ (25 1)))
+ "Enhanced shell command completion" tar
+ ((:url . "https://github.com/JonWaltman/pcmpl-args.el")
+ (:keywords "abbrev" "completion" "convenience" "processes" "terminals" "unix")
+ (:maintainer "Jonathan Waltman" . "jonathan.waltman@gmail.com")
+ (:authors
+ ("Jonathan Waltman" . "jonathan.waltman@gmail.com"))
+ (:commit . "5f2943fd70d94065496c52d21f05eb89028637cc"))])
+ (pcre2el .
+ [(1 12)
+ ((emacs
+ (25 1)))
+ "regexp syntax converter" tar
+ ((:url . "https://github.com/joddie/pcre2el")
+ (:maintainer "joddie" . "jonxfieldatgmail.com")
+ (:authors
+ ("joddie" . "jonxfieldatgmail.com"))
+ (:commit . "018531ba0cf8e2b28d1108136a0e031b6a45f1c1"))])
+ (pdf-tools .
+ [(1 1 0)
+ ((emacs
+ (26 3))
+ (tablist
+ (1 0))
+ (let-alist
+ (1 0 4)))
+ "Support library for PDF documents" tar
+ ((:url . "http://github.com/vedang/pdf-tools/")
+ (:keywords "files" "multimedia")
+ (:maintainer "Vedang Manerikar" . "vedang.manerikar@gmail.com")
+ (:authors
+ ("Andreas Politz" . "mail@andreas-politz.de"))
+ (:commit . "a9c9a12c3ecf2005fa641059368ac8284f507620"))])
+ (php-mode .
+ [(1 26 1)
+ ((emacs
+ (26 1)))
+ "Major mode for editing PHP code" tar
+ ((:url . "https://github.com/emacs-php/php-mode")
+ (:keywords "languages" "php")
+ (:maintainer "USAMI Kenta" . "tadsan@zonu.me")
+ (:commit . "9a2fe1c6c34f4f22f11efff0caf1d4e7c8ea233a"))])
+ (popon .
+ [(0 13)
+ ((emacs
+ (25 1)))
+ "\"Pop\" floating text \"on\" a window" tar
+ ((:url . "https://codeberg.org/akib/emacs-popon")
+ (:keywords "lisp" "extensions" "frames")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "bf8174cb7e6e8fe0fe91afe6b01b6562c4dc39da"))])
+ (popup .
+ [(0 5 9)
+ ((emacs
+ (24 3)))
+ "Visual Popup User Interface" tar
+ ((:url . "https://github.com/auto-complete/popup-el")
+ (:keywords "lisp")
+ (:maintainer "Jen-Chieh" . "jcs090218@gmail.com")
+ (:authors
+ ("Tomohiro Matsuyama" . "m2ym.pub@gmail.com"))
+ (:commit . "bfa10dc8af3f07632e5167457671ce3738ac0b7e"))])
+ (projectile .
+ [(2 9 1)
+ ((emacs
+ (26 1)))
+ "Manage and navigate projects in Emacs easily" tar
+ ((:url . "https://github.com/bbatsov/projectile")
+ (:keywords "project" "convenience")
+ (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev")
+ (:authors
+ ("Bozhidar Batsov" . "bozhidar@batsov.dev"))
+ (:commit . "ef17d2971bbcce13b1ac16e0e36d44fa0defca63"))])
+ (proof-general .
+ [(4 5)
+ ((emacs
+ (25 2)))
+ "A generic Emacs interface for proof assistants" tar
+ ((:url . "https://proofgeneral.github.io/")
+ (:commit . "c366365aaddeb3a65dc0816c8f93ec209dc9de44"))])
+ (prop-menu .
+ [(0 1 2)
+ ((emacs
+ (24 3))
+ (cl-lib
+ (0 5)))
+ "Create and display a context menu based on text and overlay properties" tar
+ ((:url . "https://github.com/david-christiansen/prop-menu-el")
+ (:keywords "convenience")
+ (:maintainer "David Christiansen" . "david@davidchristiansen.dk")
+ (:authors
+ ("David Christiansen" . "david@davidchristiansen.dk"))
+ (:commit . "1edda80e2e32b72e77f4f16ae5b83c312c68ee95"))])
+ (racket-mode .
+ [(1 0 20250324 74422)
+ ((emacs
+ (25 1)))
+ "Racket editing, REPL, and more" tar
+ ((:url . "https://www.racket-mode.com/")
+ (:authors
+ ("Greg Hendershott" . "racket-mode-author@greghendershott.com"))
+ (:commit . "HEAD"))])
+ (radio .
+ [(0 4 1)
+ ((emacs
+ (29 1)))
+ "Listen to Internet radio" tar
+ ((:url . "https://github.com/jroimartin/radio")
+ (:keywords "multimedia")
+ (:maintainer "Roi Martin" . "jroi.martin@gmail.com")
+ (:authors
+ ("Roi Martin" . "jroi.martin@gmail.com"))
+ (:commit . "e5119a04d91dd0d82f387016611fce103d9c47fe"))])
+ (rainbow-delimiters .
+ [(2 1 5)
+ nil "Highlight brackets according to their depth" tar
+ ((:url . "https://github.com/Fanael/rainbow-delimiters")
+ (:keywords "faces" "convenience" "lisp" "tools")
+ (:maintainer "Fanael Linithien" . "fanael4@gmail.com")
+ (:authors
+ ("Jeremy Rayman" . "opensource@jeremyrayman.com")
+ ("Fanael Linithien" . "fanael4@gmail.com"))
+ (:commit . "7919681b0d883502155d5b26e791fec15da6aeca"))])
+ (raku-mode .
+ [(0 2 1)
+ ((emacs
+ (24 4)))
+ "Major mode for editing Raku code" tar
+ ((:url . "https://github.com/hinrik/perl6-mode")
+ (:keywords "languages")
+ (:maintainer "Hinrik rn Sigurðsson" . "hinrik.sig@gmail.com")
+ (:authors
+ ("Hinrik rn Sigurðsson" . "hinrik.sig@gmail.com"))
+ (:commit . "4ee9045eeb90f7831d7c0ee2e4adfcd957f712be"))])
+ (recomplete .
+ [(0 2)
+ ((emacs
+ (26 1)))
+ "Immediately (re)complete actions" tar
+ ((:url . "https://gitlab.com/ideasman42/emacs-recomplete")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "2b38ca25e3392636fe936d3edad447970279a463"))])
+ (reformatter .
+ [(0 8)
+ ((emacs
+ (24 3)))
+ "Define commands which run reformatters on the current buffer" tar
+ ((:url . "https://github.com/purcell/emacs-reformatter")
+ (:keywords "convenience" "tools")
+ (:maintainer "Steve Purcell" . "steve@sanityinc.com")
+ (:authors
+ ("Steve Purcell" . "steve@sanityinc.com"))
+ (:commit . "ebea79504b40fecb150caf8c39621146164f997e"))])
+ (request .
+ [(0 3 3)
+ ((emacs
+ (24 4)))
+ "Compatible layer for URL request in Emacs" tar
+ ((:url . "https://github.com/tkf/emacs-request")
+ (:maintainer "Takafumi Arakaki" . "aka.tkfatgmail.com")
+ (:authors
+ ("Takafumi Arakaki" . "aka.tkfatgmail.com"))
+ (:commit . "d00e522252f0f8405308844c30b4c8d708e22d8d"))])
+ (rfc-mode .
+ [(1 4 2)
+ ((emacs
+ (25 1)))
+ "RFC document browser and viewer" tar
+ ((:url . "https://github.com/galdor/rfc-mode")
+ (:maintainer "Nicolas Martyanoff" . "nicolas@n16f.net")
+ (:authors
+ ("Nicolas Martyanoff" . "nicolas@n16f.net"))
+ (:commit . "ab09db78d9d1baa4da4f926930833598e1e978ce"))])
+ (rpm-spec-mode .
+ [(0 16)
+ nil "RPM spec file editing commands for Emacs/XEmacs" tar
+ ((:keywords "unix" "languages")
+ (:maintainer nil . "stig@bjorlykke.org")
+ (:authors
+ (nil . "stig@bjorlykke.org"))
+ (:url . "https://elpa.nongnu.org/nongnu/rpm-spec-mode.html")
+ (:commit . "7d06d19a31e888b932da6c8202ff2c73f42703a1"))])
+ (rubocop .
+ [(0 6 0)
+ ((emacs
+ (24)))
+ "An Emacs interface for RuboCop" tar
+ ((:url . "https://github.com/bbatsov/rubocop-emacs")
+ (:keywords "project" "convenience")
+ (:commit . "608a3c1dccab9a3af467ce75d94dedfbfd37b21d"))])
+ (rust-mode .
+ [(1 0 6)
+ ((emacs
+ (25 1)))
+ "A major-mode for editing Rust source code" tar
+ ((:url . "https://github.com/rust-lang/rust-mode")
+ (:keywords "languages")
+ (:maintainer "Mozilla" . "rust-mode@noreply.github.com")
+ (:authors
+ ("Mozilla" . "rust-mode@noreply.github.com"))
+ (:commit . "a8c69ce8f5e7793d2f81dbef60fb37b4b93afccf"))])
+ (sass-mode .
+ [(3 0 16)
+ ((haml-mode
+ (3 0 15)))
+ "Major mode for editing Sass files" tar
+ ((:url . "http://github.com/nex3/haml/tree/master")
+ (:keywords "markup" "language" "css")
+ (:commit . "aee28ea552dce5aade05d8a7f91514e6eb37e59f"))])
+ (scad-mode .
+ [(96 0)
+ ((emacs
+ (28 1))
+ (compat
+ (30)))
+ "A major mode for editing OpenSCAD code" tar
+ ((:url . "https://github.com/openscad/emacs-scad-mode")
+ (:keywords "languages")
+ (:maintainer
+ ("Len Trigg" . "lenbok@gmail.com")
+ ("Daniel Mendler" . "mail@daniel-mendler.de"))
+ (:commit . "36852e689c34936464b32d1558f6f9428dce63b8"))])
+ (scala-mode .
+ [(1 1 1)
+ ((emacs
+ (25 1)))
+ "Major mode for editing Scala" tar
+ ((:url . "https://github.com/hvesalai/emacs-scala-mode")
+ (:keywords "languages")
+ (:commit . "df60066e3194428266b0c66c7619327e6a4bf48d"))])
+ (scroll-on-drag .
+ [(0 1)
+ ((emacs
+ (26 2)))
+ "Interactive scrolling." tar
+ ((:url . "https://github.com/ideasman42/emacs-scroll-on-drag")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "a668537a8da77e4425b6a4110bdaba598a295f9e"))])
+ (scroll-on-jump .
+ [(0 2)
+ ((emacs
+ (26 2)))
+ "Scroll when jumping to a new point" tar
+ ((:url . "https://codeberg.com/ideasman42/emacs-scroll-on-jump")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "b1fd97c62dfc3b4430f3a42f1f504fc231487c91"))])
+ (sesman .
+ [(0 3 2)
+ ((emacs
+ (25)))
+ "Generic Session Manager" tar
+ ((:url . "https://github.com/vspinu/sesman")
+ (:keywords "process")
+ (:commit . "083cf73f3f75160bf53f6c0aa1d7f8d2922997a3"))])
+ (shellcop .
+ [(0 1 0)
+ ((emacs
+ (25 1)))
+ "Analyze info&error in shell-mode" tar
+ ((:url . "https://github.com/redguardtoo/shellcop")
+ (:keywords "unix" "tools")
+ (:maintainer "Chen Bin" . "chenbin.sh@gmail.com")
+ (:authors
+ ("Chen Bin" . "chenbin.sh@gmail.com"))
+ (:commit . "4e71f5b9199a0ad10017104a6b2bf5ef5f207dfc"))])
+ (slime .
+ [(2 31)
+ ((emacs
+ (24 3))
+ (macrostep
+ (0 9)))
+ "Superior Lisp Interaction Mode for Emacs" tar
+ ((:url . "https://github.com/slime/slime")
+ (:keywords "languages" "lisp" "slime")
+ (:commit . "a71e133aa7d3c132bb3a00cedaeee3f76b5f17ab"))])
+ (sly .
+ [(1 0 43)
+ ((emacs
+ (24 3)))
+ "Sylvester the Cat's Common Lisp IDE" tar
+ ((:url . "https://github.com/joaotavora/sly")
+ (:keywords "languages" "lisp" "sly")
+ (:commit . "613f597ecf72eb5719d4e13a4bfdbeb91373bf09"))])
+ (smartparens .
+ [(1 11 0)
+ nil "Automatic insertion, wrapping and paredit-like navigation with user defined pairs." tar
+ ((:url . "https://github.com/Fuco1/smartparens")
+ (:keywords "abbrev" "convenience" "editing")
+ (:maintainer "Matus Goljer" . "matus.goljer@gmail.com")
+ (:authors
+ ("Matus Goljer" . "matus.goljer@gmail.com"))
+ (:commit . "4873352b5d0a1c5142658122de1b6950b8fe7e4d"))])
+ (solarized-theme .
+ [(2 0 4)
+ ((emacs
+ (24 1)))
+ "The Solarized color theme" tar
+ ((:url . "http://github.com/bbatsov/solarized-emacs")
+ (:keywords "convenience" "themes" "solarized")
+ (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.dev")
+ (:authors
+ ("Bozhidar Batsov" . "bozhidar@batsov.dev"))
+ (:commit . "3fc6c26392ff76f216c2300807e0415cafbbc424"))])
+ (spacemacs-theme .
+ [(0 2)
+ ((emacs
+ (24)))
+ "Color theme with a dark and light versions." tar
+ ((:url . "https://github.com/nashamri/spacemacs-theme")
+ (:keywords "color" "theme")
+ (:maintainer "Nasser Alshammari")
+ (:authors
+ ("Nasser Alshammari"))
+ (:commit . "4857e6eb7ea20be3a2631beee42d0644dff7eb1b"))])
+ (spell-fu .
+ [(0 3)
+ ((emacs
+ (26 2)))
+ "Fast & light spelling highlighter" tar
+ ((:url . "https://gitlab.com/ideasman42/emacs-spell-fu")
+ (:keywords "convenience")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "ddad489f2c87467480520502a93e682f81bfac18"))])
+ (sqlite3 .
+ [(0 17)
+ ((emacs
+ (25 1)))
+ "Direct access to the core SQLite3 API" tar
+ ((:url . "https://github.com/pekingduck/emacs-sqlite3-api")
+ (:keywords "comm" "data" "sql")
+ (:maintainer "Y. N. Lo" . "elisp@fastmail.com")
+ (:authors
+ ("Y. N. Lo" . "elisp@fastmail.com"))
+ (:commit . "b513b71012f61895f771fc6948d6511ea8ded0a6"))])
+ (stylus-mode .
+ [(1 0 1)
+ nil "Major mode for editing .styl files" tar
+ ((:url . "https://github.com/brianc/jade-mode")
+ (:keywords "languages")
+ (:maintainer "Brian M. Carlson and other contributors")
+ (:authors
+ ("Brian M. Carlson and other contributors"))
+ (:commit . "dad17dc86c93401646802a639a98dd2ec875db6f"))])
+ (subatomic-theme .
+ [(1 8 2)
+ nil "Low contrast bluish color theme" tar
+ ((:url . "https://github.com/cryon/subatomic")
+ (:keywords "color-theme" "blue" "low contrast")
+ (:maintainer "John Olsson" . "john@cryon.se")
+ (:authors
+ ("John Olsson" . "john@cryon.se"))
+ (:commit . "2d5acd143a153e16372d59000e57d76291ab81dd"))])
+ (subed .
+ [(1 2 25)
+ ((emacs
+ (25 1)))
+ "A major mode for editing subtitles" tar
+ ((:url . "https://github.com/sachac/subed")
+ (:keywords "convenience" "files" "hypermedia" "multimedia")
+ (:maintainer "Sacha Chua" . "sacha@sachachua.com")
+ (:commit . "df6f443ac6ed4c02bacb64a3f1c5c7888dfca5d0"))])
+ (sweeprolog .
+ [(0 27 6)
+ ((emacs
+ (27 1))
+ (compat
+ (29 1 4 2)))
+ "Embedded SWI-Prolog" tar
+ ((:url . "https://git.sr.ht/~eshel/sweep")
+ (:keywords "prolog" "languages" "extensions")
+ (:maintainer "Eshel Yaron" . "~eshel/dev@lists.sr.ht")
+ (:authors
+ ("Eshel Yaron" . "me@eshelyaron.com"))
+ (:commit . "bd31199a34c0619b346954f25875fcb7239e2b86"))])
+ (swift-mode .
+ [(9 2 0)
+ ((emacs
+ (24 4))
+ (seq
+ (2 3)))
+ "Major-mode for Apple's Swift programming language" tar
+ ((:url . "https://github.com/swift-emacs/swift-mode")
+ (:keywords "languages" "swift")
+ (:maintainer "taku0" . "mxxouy6x3m_github@tatapa.org")
+ (:authors
+ ("taku0" . "mxxouy6x3m_github@tatapa.org")
+ ("Chris Barrett" . "chris.d.barrett@me.com")
+ ("Bozhidar Batsov" . "bozhidar@batsov.com")
+ ("Arthur Evstifeev" . "lod@pisem.net"))
+ (:commit . "ab189d6e89ac4c0f776d691a41ddeaf9730260d1"))])
+ (symbol-overlay .
+ [(4 3)
+ ((emacs
+ (24 3))
+ (seq
+ (2 2)))
+ "Highlight symbols with keymap-enabled overlays" tar
+ ((:url . "https://github.com/wolray/symbol-overlay/")
+ (:keywords "faces" "matching")
+ (:maintainer "wolray" . "wolray@foxmail.com")
+ (:authors
+ ("wolray" . "wolray@foxmail.com"))
+ (:commit . "6151f4279bd94b5960149596b202cdcb45cacec2"))])
+ (systemd .
+ [(1 6 1)
+ ((emacs
+ (24 4)))
+ "Major mode for editing systemd units" tar
+ ((:keywords "tools" "unix")
+ (:maintainer "Mark Oteiza" . "mvoteiza@udel.edu")
+ (:authors
+ ("Mark Oteiza" . "mvoteiza@udel.edu"))
+ (:url . "https://elpa.nongnu.org/nongnu/systemd.html")
+ (:commit . "8742607120fbc440821acbc351fda1e8e68a8806"))])
+ (tablist .
+ [(1 0)
+ ((emacs
+ (24 3)))
+ "Extended tabulated-list-mode" tar
+ ((:keywords "extensions" "lisp")
+ (:maintainer "Andreas Politz" . "politza@fh-trier.de")
+ (:authors
+ ("Andreas Politz" . "politza@fh-trier.de"))
+ (:url . "https://elpa.nongnu.org/nongnu/tablist.html")
+ (:commit . "f6b495d09494784163c3e6ba75b771b71fe226a8"))])
+ (tangotango-theme .
+ [(0 0 7)
+ nil "Tango Palette color theme for Emacs 24." tar
+ ((:url . "https://github.com/juba/color-theme-tangotango")
+ (:keywords "tango" "palette" "color" "theme" "emacs")
+ (:commit . "8843dab8109d4334be69038a9c689a929b6be687"))])
+ (teco .
+ [(9)
+ nil "Teco interpreter for Gnu Emacs" tar
+ ((:url . "https://github.com/mtk/teco.git")
+ (:keywords "convenience" "emulations" "files")
+ (:maintainer "Mark T. Kennedy" . "mtk@acm.org")
+ (:authors
+ ("Dale R. Worley" . "worley@alum.mit.edu"))
+ (:commit . "3e1db9d41d44f52c6b0de4349c5bbfeb125b2735"))])
+ (telephone-line .
+ [(0 5)
+ ((emacs
+ (24 4))
+ (cl-lib
+ (0 5))
+ (cl-generic
+ (0 2))
+ (seq
+ (1 8)))
+ "Rewrite of Powerline" tar
+ ((:url . "https://github.com/dbordak/telephone-line")
+ (:keywords "mode-line")
+ (:maintainer "Daniel Bordak" . "dbordak@fastmail.fm")
+ (:authors
+ ("Daniel Bordak" . "dbordak@fastmail.fm"))
+ (:commit . "ef753fae21de7ca3c4268488b35ee83a36d6d98a"))])
+ (testcover-mark-line .
+ [(0 3)
+ ((emacs
+ (25 1)))
+ "Mark whole line with Testcover" tar
+ ((:url . "https://codeberg.org/akib/emacs-testcover-mark-line")
+ (:keywords "lisp" "utility")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "36a2a9422dcdf6f01e842b153fa492c1604ca48b"))])
+ (textile-mode .
+ [(1 0 0)
+ nil "Textile markup editing major mode" tar
+ ((:url . "https://github.com/juba/textile-mode")
+ (:keywords "wp" "languages")
+ (:maintainer "Julien Barnier" . "julien@nozav.org")
+ (:authors
+ ("Julien Barnier" . "julien@nozav.org"))
+ (:commit . "16ac26b5b4c9bb5c7a3c7aed6c6b3a6c5fb8c62c"))])
+ (toc-org .
+ [(1 1)
+ nil "add table of contents to org-mode files (formerly, org-toc)" tar
+ ((:url . "https://github.com/snosov1/toc-org")
+ (:keywords "org-mode" "org-toc" "toc-org" "org" "toc" "table" "of" "contents")
+ (:maintainer "Sergei Nosov" . "sergei.nosov[at]gmail.com")
+ (:authors
+ ("Sergei Nosov" . "sergei.nosov[at]gmail.com"))
+ (:commit . "328d34144f65609cf6d3e1f39037e661a90b4489"))])
+ (totp-auth .
+ [(1 0)
+ ((emacs
+ (27 1))
+ (base32
+ (0 1)))
+ "RFC6238 TOTP" tar
+ ((:url . "https://gitlab.com/fledermaus/totp.el")
+ (:keywords "2fa" "two-factor" "totp" "otp" "password" "comm")
+ (:maintainer "Vivek Das Mohapatra" . "vivek@etla.org")
+ (:authors
+ ("Vivek Das Mohapatra" . "vivek@etla.org"))
+ (:commit . "v1.0"))])
+ (tp .
+ [(0 7)
+ ((emacs
+ (28 1))
+ (transient
+ (0 5 0)))
+ "Utilities for transient menus that POST to an API" tar
+ ((:url . "https://codeberg.org/martianh/tp.el")
+ (:keywords "convenience" "api" "requests")
+ (:maintainer "Marty Hiatt" . "mousebot@disroot.org")
+ (:authors
+ ("Marty Hiatt" . "mousebot@disroot.org"))
+ (:commit . "cce2dfe0ec2b5c070cb13a7bdf95695eeb6e3caf"))])
+ (treesit-fold .
+ [(0 2 1)
+ ((emacs
+ (29 1)))
+ "Code folding using treesit" tar
+ ((:url . "https://github.com/emacs-tree-sitter/treesit-fold")
+ (:keywords "convenience" "folding" "tree-sitter")
+ (:maintainer "Jen-Chieh" . "jcs090218@gmail.com")
+ (:authors
+ ("Junyi Hou" . "junyi.yi.hou@gmail.com")
+ ("Jen-Chieh" . "jcs090218@gmail.com"))
+ (:commit . "1b4b552867d8eaa03008b887ec0c9236c3c2b416"))])
+ (treeview .
+ [(1 3 1)
+ ((emacs
+ (25 1)))
+ "A generic tree navigation library" tar
+ ((:url . "https://github.com/tilmanrassy/emacs-treeview")
+ (:keywords "lisp" "tools" "internal" "convenience")
+ (:maintainer "Tilman Rassy" . "tilman.rassy@googlemail.com")
+ (:authors
+ ("Tilman Rassy" . "tilman.rassy@googlemail.com"))
+ (:commit . "9a1a16f84fc3c368443641f7a71aa2407ad91d38"))])
+ (tuareg .
+ [(3 0 1)
+ ((emacs
+ (26 3))
+ (caml
+ (4 8)))
+ "OCaml mode" tar
+ ((:url . "https://github.com/ocaml/tuareg")
+ (:keywords "ocaml" "languages")
+ (:maintainer
+ ("Christophe Troestler" . "Christophe.Troestler@umons.ac.be")
+ ("Stefan Monnier" . "monnier@iro.umontreal.ca"))
+ (: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"))
+ (:commit . "4d94293cc5a7bba6cd043e29968719ce597d65f5"))])
+ (typescript-mode .
+ [(0 4)
+ ((emacs
+ (24 3)))
+ "Major mode for editing typescript" tar
+ ((:url . "http://github.com/ananthakumaran/typescript.el")
+ (:keywords "typescript" "languages")
+ (:commit . "2a58631230fe2d176352af262a0efdecc21f90ac"))])
+ (typst-ts-mode .
+ [(0 11 0)
+ ((emacs
+ (29 1)))
+ "Tree Sitter support for Typst" tar
+ ((:url . "https://codeberg.org/meow_king/typst-ts-mode")
+ (:keywords "typst" "languages" "tree-sitter")
+ (:maintainer
+ ("Ziqi Yang" . "mr.meowking@anche.no")
+ ("Huan Nguyen" . "nguyenthieuhuan@gmail.com"))
+ (:authors
+ ("Ziqi Yang" . "mr.meowking@anche.no"))
+ (:commit . "d4e4a21f1396fbbdcfbc33a117aff5285062bef8"))])
+ (ujelly-theme .
+ [(1 3 6)
+ nil "Ujelly theme for GNU Emacs 24 (deftheme)" tar
+ ((:url . "http://github.com/marktran/color-theme-ujelly")
+ (:maintainer "Mark Tran" . "mark.tran@gmail.com")
+ (:authors
+ ("Mark Tran" . "mark.tran@gmail.com"))
+ (:commit . "7345ab821739aafa2ec079a71fa7de350a869f0e"))])
+ (undo-fu .
+ [(0 5)
+ ((emacs
+ (25 1)))
+ "Undo helper with redo" tar
+ ((:url . "https://codeberg.org/ideasman42/emacs-undo-fu")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "57615408f9bd70247d2b2844a1946a00300ef5bb"))])
+ (undo-fu-session .
+ [(0 7)
+ ((emacs
+ (28 1)))
+ "Persistent undo, available between sessions" tar
+ ((:url . "https://codeberg.org/ideasman42/emacs-undo-fu-session")
+ (:keywords "convenience")
+ (:maintainer "Campbell Barton" . "ideasman42@gmail.com")
+ (:authors
+ ("Campbell Barton" . "ideasman42@gmail.com"))
+ (:commit . "cd619e30ebdbf0770305dd4f51c50548ab08d779"))])
+ (vc-fossil .
+ [(20230504)
+ nil "VC backend for the fossil sofware configuraiton management system" tar
+ ((:maintainer "Alfred M. Szmidt" . "ams@gnu.org")
+ (:authors
+ ("Venkat Iyer" . "venkat@comit.com"))
+ (:url . "https://elpa.nongnu.org/nongnu/vc-fossil.html")
+ (:commit . "4a4a3e4df83ba2f1ea8bfd8aa7e9f9b2c1c32ca9"))])
+ (vcomplete .
+ [(2 0)
+ ((emacs
+ (25 1)))
+ "Visual completions" tar
+ ((:url . "https://dsemy.com/projects/vcomplete")
+ (:keywords "convenience" "matching")
+ (:maintainer "Vcomplete Mailing List" . "~dsemy/vcomplete-devel@lists.sr.ht")
+ (:authors
+ ("Daniel Semyonov" . "daniel@dsemy.com"))
+ (:commit . "93ae3db40d07ae15e61d34c3c3870de5d2fce2de"))])
+ (visual-fill-column .
+ [(2 6 3)
+ ((emacs
+ (25 1)))
+ "fill-column for visual-line-mode" tar
+ ((:url . "https://codeberg.org/joostkremers/visual-fill-column")
+ (:maintainer "Joost Kremers" . "joostkremers@fastmail.fm")
+ (:authors
+ ("Joost Kremers" . "joostkremers@fastmail.fm"))
+ (:commit . "e04d3521b6dc2435de4c4a4b9cac5feb194f0d5b"))])
+ (web-mode .
+ [(17 3 21)
+ ((emacs
+ (23 1)))
+ "major mode for editing web templates" tar
+ ((:url . "https://web-mode.org")
+ (:keywords "languages")
+ (:maintainer "François-Xavier Bois" . "fxbois@gmail.com")
+ (:commit . "f90d44a14bfdef03eb866b3230cd221c9b2ca393"))])
+ (webpaste .
+ [(3 2 2)
+ ((emacs
+ (24 4))
+ (request
+ (0 2 0))
+ (cl-lib
+ (0 5)))
+ "Paste to pastebin-like services" tar
+ ((:url . "https://github.com/etu/webpaste.el")
+ (:keywords "convenience" "comm" "paste")
+ (:maintainer "Elis etu Hirwing" . "elis@hirwing.se")
+ (:authors
+ ("Elis etu Hirwing" . "elis@hirwing.se"))
+ (:commit . "78272662e6992b8614e79a571ff2395fa9630357"))])
+ (wfnames .
+ [(1 2)
+ ((emacs
+ (24 4)))
+ "Edit filenames" tar
+ ((:url . "https://github.com/thierryvolpiatto/wfnames")
+ (:maintainer "Thierry Volpiatto" . "thievol@posteo.net")
+ (:authors
+ ("Thierry Volpiatto" . "thievol@posteo.net"))
+ (:commit . "2f014c48fde0979da4ce3c0dbda81389c61a26bc"))])
+ (wgrep .
+ [(3 0 0)
+ ((emacs
+ (25 1)))
+ "Writable grep buffer and apply the changes to files" tar
+ ((:url . "http://github.com/mhayashi1120/Emacs-wgrep/raw/master/wgrep.el")
+ (:keywords "grep" "edit" "extensions")
+ (:maintainer "Masahiro Hayashi" . "mhayashi1120@gmail.com")
+ (:authors
+ ("Masahiro Hayashi" . "mhayashi1120@gmail.com"))
+ (:commit . "2d1c0509215499e927817b0d7d3f133db678e010"))])
+ (why-this .
+ [(2 0 4)
+ ((emacs
+ (27 1)))
+ "Why is this line here? Ask version control" tar
+ ((:url . "https://codeberg.org/akib/emacs-why-this")
+ (:keywords "tools" "convenience" "vc")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "5203d9379afaf6703746823a580c804e1dd98e08"))])
+ (with-editor .
+ [(3 4 3)
+ ((emacs
+ (26 1))
+ (compat
+ (30 0 0 0)))
+ "Use the Emacsclient as $EDITOR" tar
+ ((:url . "https://github.com/magit/with-editor")
+ (:keywords "processes" "terminals")
+ (:maintainer "Jonas Bernoulli" . "emacs.with-editor@jonas.bernoulli.dev")
+ (:authors
+ ("Jonas Bernoulli" . "emacs.with-editor@jonas.bernoulli.dev"))
+ (:commit . "ca902ae02972bdd6919a902be2593d8cb6bd991b"))])
+ (with-simulated-input .
+ [(3 0)
+ ((emacs
+ (24 4)))
+ "A macro to simulate user input non-interactively" tar
+ ((:url . "https://github.com/DarwinAwardWinner/with-simulated-input")
+ (:keywords "lisp" "tools" "extensions")
+ (:maintainer "Ryan C Thompson" . "rct@thompsonclan.org")
+ (:authors
+ ("Ryan C. Thompson" . "rct@thompsonclan.org")
+ ("Nikita Bloshchanevich" . "nikblos@outlook.com"))
+ (:commit . "07bdfbe9ab9eab4a04ad02e98b011649a4f4e6a2"))])
+ (workroom .
+ [(2 3 1)
+ ((emacs
+ (25 1))
+ (project
+ (0 3 0))
+ (compat
+ (28 1 2 2)))
+ "Named rooms for work without irrelevant distracting buffers" tar
+ ((:url . "https://codeberg.org/akib/emacs-workroom")
+ (:keywords "tools" "convenience")
+ (:maintainer "Akib Azmain Turja" . "akib@disroot.org")
+ (:authors
+ ("Akib Azmain Turja" . "akib@disroot.org"))
+ (:commit . "cb8654191b23c9b02a79660c3d8c969709c6fcbe"))])
+ (writegood-mode .
+ [(2 2 0)
+ nil "Polish up poor writing on the fly" tar
+ ((:url . "http://github.com/bnbeckwith/writegood-mode")
+ (:keywords "writing" "weasel-words" "grammar")
+ (:commit . "d54eadeedb8bf3aa0e0a584c0a7373c69644f4b8"))])
+ (ws-butler .
+ [(1 3)
+ ((emacs
+ (24 1)))
+ "Unobtrusively remove trailing whitespace" tar
+ ((:url . "https://elpa.nongnu.org/nongnu/ws-butler.html")
+ (:keywords "text")
+ (:maintainer "Sean Whitton" . "spwhitton@spwhitton.name")
+ (:authors
+ ("Le Wang" . "l26wang@gmail.com"))
+ (:commit . "9ee5a7657a22e836618813c2e2b64a548d27d2ff"))])
+ (xah-fly-keys .
+ [(26 11 20250325184849)
+ ((emacs
+ (27)))
+ "ergonomic modal keybinding minor mode." tar
+ ((:url . "http://xahlee.info/emacs/misc/xah-fly-keys.html")
+ (:keywords "convenience" "vi" "vim" "ergoemacs" "keybinding")
+ (:maintainer "Xah Lee" . "xah@xahlee.org")
+ (:commit . "e8ba384256e8c88c7fe218b85c7da9e44d9b2074"))])
+ (xkcd .
+ [(1 1)
+ ((json
+ (1 3)))
+ "View xkcd from Emacs" tar
+ ((:url . "https://github.com/vibhavp/emacs-xkcd")
+ (:keywords "xkcd" "webcomic")
+ (:maintainer "Vibhav Pant" . "vibhavp@gmail.com")
+ (:authors
+ ("Vibhav Pant" . "vibhavp@gmail.com"))
+ (:commit . "ca3eed560361fad276a1e1c6fd0104ce902f358a"))])
+ (xml-rpc .
+ [(1 6 17)
+ ((emacs
+ (24 1)))
+ "An elisp implementation of clientside XML-RPC" tar
+ ((:url . "http://github.com/xml-rpc-el/xml-rpc-el")
+ (:keywords "xml" "rpc" "network" "comm")
+ (:maintainer "Mark A. Hershberger" . "mah@everybody.org")
+ (:commit . "47cd3409d6c376adc6b9e46c30b1033289ddfb49"))])
+ (yaml-mode .
+ [(0 0 16)
+ ((emacs
+ (24 1)))
+ "Major mode for editing YAML files" tar
+ ((:url . "https://github.com/yoshiki/yaml-mode")
+ (:keywords "data" "yaml")
+ (:maintainer "Vasilij Schneidermann" . "mail@vasilij.de")
+ (:authors
+ ("Yoshiki Kurihara" . "clouder@gmail.com")
+ ("Marshall T. Vandegrift" . "llasram@gmail.com"))
+ (:commit . "6bb9e7f6e1c9224f743a8a68bc210d10eb8cb788"))])
+ (yasnippet-snippets .
+ [(1 0)
+ ((yasnippet
+ (0 8 0)))
+ "Collection of yasnippet snippets" tar
+ ((:url . "https://github.com/AndreaCrotti/yasnippet-snippets")
+ (:keywords "snippets")
+ (:maintainer "Andrea Crotti" . "andrea.crotti.0@gmail.com")
+ (:authors
+ ("Andrea Crotti" . "andrea.crotti.0@gmail.com"))
+ (:commit . "39e640c037f51602f821721c200ab43b71febc90"))])
+ (zenburn-theme .
+ [(2 8 0)
+ nil "A low contrast color theme for Emacs." tar
+ ((:url . "http://github.com/bbatsov/zenburn-emacs")
+ (:maintainer "Bozhidar Batsov" . "bozhidar@batsov.com")
+ (:authors
+ ("Bozhidar Batsov" . "bozhidar@batsov.com"))
+ (:commit . "8a1f9d28f503615e5d9b3eac59a2f3c14e75fc20"))])
+ (zig-mode .
+ [(0 0 8)
+ ((emacs
+ (26 1))
+ (reformatter
+ (0 6)))
+ "A major mode for the Zig programming language" tar
+ ((:url . "https://github.com/zig-lang/zig-mode")
+ (:keywords "zig" "languages")
+ (:maintainer "Jen-Chieh" . "jcs090218@gmail.com")
+ (:authors
+ ("Andrea Orru" . "andreaorru1991@gmail.com")
+ ("Andrew Kelley" . "superjoe30@gmail.com"))
+ (:commit . "f3e952c24a9c152307a6e7ca1645b5f72be74314"))]))
diff --git a/elpa/archives/nongnu/archive-contents.signed b/elpa/archives/nongnu/archive-contents.signed
new file mode 100644
index 0000000..4d37bbd
--- /dev/null
+++ b/elpa/archives/nongnu/archive-contents.signed
@@ -0,0 +1 @@
+Good signature from 645357D2883A0966 GNU ELPA Signing Agent (2023) <elpasign@elpa.gnu.org> (trust undefined) created at 2025-04-01T09:10:04+0000 using EDDSA \ No newline at end of file
diff --git a/elpa/evil-1.15.0.signed b/elpa/evil-1.15.0.signed
new file mode 100644
index 0000000..8d2f86f
--- /dev/null
+++ b/elpa/evil-1.15.0.signed
@@ -0,0 +1 @@
+Good signature from 645357D2883A0966 GNU ELPA Signing Agent (2023) <elpasign@elpa.gnu.org> (trust undefined) created at 2024-03-31T11:15:04+0000 using EDDSA \ No newline at end of file
diff --git a/elpa/evil-1.15.0/.dir-locals.el b/elpa/evil-1.15.0/.dir-locals.el
new file mode 100644
index 0000000..d79ba71
--- /dev/null
+++ b/elpa/evil-1.15.0/.dir-locals.el
@@ -0,0 +1,3 @@
+;; Don't use tabs for el files
+((emacs-lisp-mode .
+ ((indent-tabs-mode . nil))))
diff --git a/elpa/evil-1.15.0/.github/ISSUE_TEMPLATE.md b/elpa/evil-1.15.0/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000..53cbe14
--- /dev/null
+++ b/elpa/evil-1.15.0/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,29 @@
+<!-- Replace every comment and delete this line -->
+# Issue type
+
+<!-- Pick one of the following, delete the rest -->
+- Bug report
+- Enhancement request
+- Question
+- Other
+
+# Environment
+
+Emacs version: <!-- M-x emacs-version -->
+Operating System: <!-- Name and version, e.g. Windows 10, macOS Sierra, Debian Jessie -->
+Evil version: <!-- M-x evil-version -->
+Evil installation type: <!-- MELPA, MELPA stable, NonGNU ELPA, Quelpa, El-Get, manual -->
+Graphical/Terminal: <!-- Whether you're running Emacs in a terminal emulator or under X -->
+Tested in a `make emacs` session (see [CONTRIBUTING.md](https://github.com/emacs-evil/evil/blob/master/CONTRIBUTING.md#bug-reports)): <!-- Yes / No -->
+
+# Reproduction steps
+- Start Emacs
+<!-- Minimal list of steps to reproduce the bug, preferably using `make emacs`: https://github.com/emacs-evil/evil/blob/master/CONTRIBUTING.md#bug-reports -->
+
+# Expected behavior
+<!-- Describe how it should behave -->
+
+# Actual behavior
+<!-- Describe how it does behave -->
+
+# Further notes
diff --git a/elpa/evil-1.15.0/.github/workflows/test.yml b/elpa/evil-1.15.0/.github/workflows/test.yml
new file mode 100644
index 0000000..55c0f8a
--- /dev/null
+++ b/elpa/evil-1.15.0/.github/workflows/test.yml
@@ -0,0 +1,35 @@
+name: CI
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ emacs_version:
+ - 24.5
+ - 25.3
+ - 26.3
+ - 27.1
+ - snapshot
+ steps:
+ - uses: purcell/setup-emacs@master
+ with:
+ version: ${{ matrix.emacs_version }}
+
+ - uses: actions/checkout@v2
+
+ - name: Print emacs version
+ run: |
+ emacs --version
+
+ - name: Run tests
+ run: |
+ make test
+
+ - name: Print results
+ if: ${{ always() }}
+ run: |
+ cat test-results.txt
diff --git a/elpa/evil-1.15.0/CHANGES.org b/elpa/evil-1.15.0/CHANGES.org
new file mode 100644
index 0000000..102c6ab
--- /dev/null
+++ b/elpa/evil-1.15.0/CHANGES.org
@@ -0,0 +1,56 @@
+* Changes and New Features in Evil
+
+** News in 1.0.7
+
+ * Fix #319.
+
+** News in 1.0.6
+
+ * Fix bug induced in emacs trunk due to changed behaviour of
+ `overriding-terminal-local-map` (fixes #309).
+
+** News in 1.0.5
+
+ * Fix bug in `show-paren-mode` due to variable renaming in latest
+ emacs.
+
+ * Fix bug in isearch module due to variable renaming in latest
+ emacs.
+
+** News in 1.0.4
+
+ * Undo one restriction when <c> argument is read in operator state.
+
+** News in 1.0.3
+
+ * Fix `evil-delete-backward-word` at first non-blank in a line.
+
+** News in 1.0.2
+
+ * Fix #290.
+
+** News in 1.0.1
+
+*** Improvements
+
+ * An ELPA package built by =make elpa= contains COPYING file.
+
+ * Bind =[tab]= like =\t= in =evil-ex-completion-map=, so that it
+ cannot be overwritten by a =[tab]= binding in the parent keymap
+ =minibuffer-local-completion-map=.
+
+ * Improve worst case performance of internal functions
+ =evil-in-string-p=, =evil-string-beginning= and
+ =evil-string-end=. This functions are used, e.g., in certain text
+ objects to detect whether point is within a string.
+
+ * Update authors list.
+
+*** Fixes
+
+ * The interactive code =<state>= is fixed and used correctly in
+ =evil-ex-set-initial-state=.
+
+ * =evil-ex-global= always generates a single undo-step.
+
+ * Resolved issues: #249, #250, #253 and #257.
diff --git a/elpa/evil-1.15.0/CONTRIBUTING.md b/elpa/evil-1.15.0/CONTRIBUTING.md
new file mode 100644
index 0000000..913a5e2
--- /dev/null
+++ b/elpa/evil-1.15.0/CONTRIBUTING.md
@@ -0,0 +1,56 @@
+# Bug reports
+
+Bug reports and feature requests should be made on the
+[issue tracker](https://github.com/emacs-evil/evil/issues) here on github.
+
+**Before** sending a bug report, please take note of the following comments.
+
+1. Please provide a full description of the configuration of your
+ system. This includes
+
+ - Emacs version,
+ - Evil version (e.g., the hash in the git repository),
+ - Whether you use Emacs/Evil in X mode or in terminal mode,
+ - Whether you use Emacs/Evil in terminal mode with some terminal multiplexer
+ like **tmux** or **screen** (and see below).
+
+2. Test the bug in a clean Emacs environment without any additional
+ packages loaded (besides Evil itself). You can easily get such an
+ environment by executing either `make emacs` (for X) or `make
+ terminal` (for terminal mode) in Evil's source directory. If your
+ bug is related to some other package, try to load only this package
+ from the clean environment after using `M-x package-initialize`
+ first.
+
+3. If you've just updated your Evil from the repository, **do not forget to
+ recompile** Evil by executing `make` in Evil's source directory.
+
+4. If possible, try to give a minimal example how to reproduce the error
+ starting from a fresh Emacs. The minimal example could be some buffer content
+ and a sequence of key-strokes that show up the error.
+
+5. If the bug you want to report is related to the behavior of some commands or
+ motions, please note the following. One goal of Evil is to get a behavior as
+ close to **Vim** as possible unless there is a good reason not to do so. The
+ reason is that many users come from Vim or use both, Vim and Evil, and we
+ want to keep the number of annoying differences between both as small as
+ possible, especially in common commands. In case you get an unexpected
+ behavior, please compare the behavior with plain Vim (i.e., without any
+ customization), if there's a difference please file the bug with a
+ description of this difference (and possibly a reference to Vim's
+ documentation). If you realize that both, Vim and Evil, behave the same but
+ you want a different behavior, you may make a **feature request** for some
+ customization option (but the default behavior will probably not be changed
+ in favor for Vim compatibility). Evil already contains several customization
+ options and sometimes the desired changes can be achieved as easily as
+ redefining some key-bindings.
+
+# Pull Requests
+
+1. Please follow the
+ [Emacs Lisp Style Guide](https://github.com/bbatsov/emacs-lisp-style-guide/)
+2. When in doubt, adhere to the style conventions in the source code,
+ but don't be afraid of suggesting code enhancements in case you
+ encounter suboptimal code.
+3. If your pull requests adds a feature or fixes a regression, add
+ tests covering it to `evil-tests.el`.
diff --git a/elpa/evil-1.15.0/Cask b/elpa/evil-1.15.0/Cask
new file mode 100644
index 0000000..faf2338
--- /dev/null
+++ b/elpa/evil-1.15.0/Cask
@@ -0,0 +1,5 @@
+(package "evil" "1.15.0" "Extensible Vi layer for Emacs.")
+
+(files "*.el")
+
+;; (depends-on "goto-chg" "0.6.3")
diff --git a/elpa/evil-1.15.0/Makefile b/elpa/evil-1.15.0/Makefile
new file mode 100644
index 0000000..29e2eeb
--- /dev/null
+++ b/elpa/evil-1.15.0/Makefile
@@ -0,0 +1,121 @@
+SHELL = /bin/sh
+EMACS ?= emacs
+FILES = $(filter-out evil-test-helpers.el evil-tests.el evil-pkg.el,$(wildcard evil*.el))
+VERSION := $(shell sed -ne '/define-package/,$$p' evil-pkg.el | sed -ne '/^\s*"[[:digit:]]\+\(\.[[:digit:]]\+\)*"\s*$$/ s/^.*"\(.*\)".*$$/\1/p')
+ELPAPKG = evil-$(VERSION)
+PROFILER =
+DOC = doc
+TAG =
+LIBS = -L lib
+
+ELCFILES = $(FILES:.el=.elc)
+
+.PHONY: all compile compile-batch docstrings doc clean tests test emacs term terminal profiler indent elpa version
+
+# Byte-compile Evil.
+all: compile
+compile: $(ELCFILES)
+
+.depend: $(FILES)
+ @echo Compute dependencies
+ @rm -f .depend
+ @for f in $(FILES); do \
+ sed -n "s/ *(require '\(evil-[^)]*\).*)/$${f}c: \1.elc/p" $$f >> .depend;\
+ done
+
+-include .depend
+
+$(ELCFILES): %.elc: %.el
+ $(EMACS) --batch -Q -L . $(LIBS) -f batch-byte-compile $<
+
+# Byte-compile all files in one batch. This is faster than
+# compiling each file in isolation, but also less stringent.
+compile-batch: clean
+ $(EMACS) --batch -Q -L . $(LIBS) -f batch-byte-compile ${FILES}
+
+# Documentation.
+docstrings:
+ @$(EMACS) --script scripts/evil-extract-docstrings
+
+doc: docstrings
+ @$(MAKE) -C doc texinfo
+
+info: doc
+ @$(MAKE) -C doc info
+
+# Delete byte-compiled files etc.
+clean:
+ rm -f *~
+ rm -f \#*\#
+ rm -f *.elc
+ rm -f .depend
+ @$(MAKE) -C doc clean
+
+# Run tests.
+# The TAG variable may specify a test tag or a test name:
+# make test TAG=repeat
+# This will only run tests pertaining to the repeat system.
+test:
+ $(EMACS) -nw -Q --batch -L . $(LIBS) -l evil-tests.el \
+ --eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}))"
+
+# Byte-compile Evil and run all tests.
+tests: compile
+ $(EMACS) -nw -Q -L . $(LIBS) -l evil-tests.el \
+ --eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}))"
+ rm -f *.elc .depend
+
+# Load Evil in a fresh instance of Emacs and run all tests.
+emacs:
+ $(EMACS) -Q -L . $(LIBS) -l goto-chg.el -l evil-tests.el \
+ --eval "(evil-mode 1)" \
+ --eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}) t)"
+
+# Load Evil in a terminal Emacs and run all tests.
+term: terminal
+terminal:
+ $(EMACS) -nw -Q -L . $(LIBS) -l goto-chg.el -l evil-tests.el \
+ --eval "(evil-mode 1)" \
+ --eval "(evil-tests-initialize '(${TAG}) '(${PROFILER}) t)"
+
+# Run all tests with profiler.
+profiler:
+ $(EMACS) --batch -Q -L . $(LIBS) -l goto-chg.el -l evil-tests.el \
+ --eval "(evil-tests-initialize '(${TAG}) (or '(${PROFILER}) t))"
+
+# Re-indent all Evil code.
+# Loads Evil into memory in order to indent macros properly.
+# Also removes trailing whitespace, tabs and extraneous blank lines.
+indent: clean
+ $(EMACS) --batch --eval '(setq vc-handled-backends nil)' ${FILES} evil-tests.el -Q -L . $(LIBS) -l evil-tests.el \
+ --eval "(dolist (buffer (reverse (buffer-list))) \
+ (when (buffer-file-name buffer) \
+ (set-buffer buffer) \
+ (message \"Indenting %s\" (current-buffer)) \
+ (setq-default indent-tabs-mode nil) \
+ (untabify (point-min) (point-max)) \
+ (indent-region (point-min) (point-max)) \
+ (delete-trailing-whitespace) \
+ (untabify (point-min) (point-max)) \
+ (goto-char (point-min)) \
+ (while (re-search-forward \"\\n\\\\{3,\\\\}\" nil t) \
+ (replace-match \"\\n\\n\")) \
+ (when (buffer-modified-p) (save-buffer 0))))"
+
+# Create an ELPA package.
+elpa:
+ @echo "Creating ELPA package $(ELPAPKG).tar"
+ @rm -rf ${ELPAPKG}
+ @mkdir ${ELPAPKG}
+ @cp $(FILES) COPYING evil-pkg.el ${ELPAPKG}
+ @tar cf ${ELPAPKG}.tar ${ELPAPKG}
+ @rm -rf ${ELPAPKG}
+
+# Change the version using make VERSION=x.y.z
+version:
+ @$(EMACS) --script scripts/evilupdate "${VERSION}"
+
+# Change the version using make VERSION=x.y.z, but do not post to the newsgroup
+nversion:
+ @$(EMACS) --script scripts/evilupdate nonews "${VERSION}"
+
diff --git a/elpa/evil-1.15.0/README.md b/elpa/evil-1.15.0/README.md
new file mode 100644
index 0000000..198b183
--- /dev/null
+++ b/elpa/evil-1.15.0/README.md
@@ -0,0 +1,82 @@
+![An extensible vi layer for Emacs](https://raw.githubusercontent.com/emacs-evil/evil/master/doc/logo.png)
+
+[![Build status](https://github.com/emacs-evil/evil/actions/workflows/test.yml/badge.svg)](https://github.com/emacs-evil/evil/actions/workflows/test.yml)
+[![MELPA](https://melpa.org/packages/evil-badge.svg)](https://melpa.org/#/evil)
+[![MELPA Stable](https://stable.melpa.org/packages/evil-badge.svg)](https://stable.melpa.org/#/evil)
+[![NonGNU ELPA](http://elpa.nongnu.org/nongnu/evil.svg)](http://elpa.nongnu.org/nongnu/evil.html)
+[![Documentation Status](https://readthedocs.org/projects/evil/badge/?version=latest)](https://evil.readthedocs.io/en/latest/?badge=latest)
+[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
+
+Evil is an **e**xtensible **vi** **l**ayer
+for [Emacs](http://www.gnu.org/software/emacs/). It emulates the main features
+of [Vim](http://www.vim.org/), and provides facilities for writing custom
+extensions. Also see our page on [EmacsWiki](http://emacswiki.org/emacs/Evil).
+
+# Installation
+
+See the
+[official documentation](https://evil.readthedocs.io/en/latest/overview.html#installation-via-package-el)
+for installation instructions. We recommend using *package.el*.
+
+As a quickstart, you can add the following code to your Emacs init
+file.
+
+```elisp
+;; Set up package.el to work with MELPA
+(require 'package)
+(add-to-list 'package-archives
+ '("melpa" . "https://melpa.org/packages/"))
+(package-initialize)
+(package-refresh-contents)
+
+;; Download Evil
+(unless (package-installed-p 'evil)
+ (package-install 'evil))
+
+;; Enable Evil
+(require 'evil)
+(evil-mode 1)
+```
+
+## Dependencies
+
+* Evil requires Emacs 24.1 or later.
+
+* Evil requires any of the following for `C-r`:
+ * `undo-redo` from Emacs 28
+ * The [undo-tree](https://gitlab.com/tsc25/undo-tree) package
+ (available via GNU ELPA)
+ * The [undo-fu](https://gitlab.com/ideasman42/emacs-undo-fu) package
+ (available via MELPA)
+
+* For the motions `g;` `g,` and for the last-change-register `.`, Evil
+ requires the [goto-chg.el](https://github.com/emacs-evil/goto-chg)
+ package (available via MELPA and NonGNU ELPA), which provides the
+ functions `goto-last-change` and `goto-last-change-reverse`.
+
+* For Emacs 24.1 and 24.2 Evil also requires
+ [cl-lib](https://elpa.gnu.org/packages/cl-lib.html).
+
+# Documentation
+
+The latest version of the documentation is readable online
+[here](https://evil.readthedocs.io/en/latest/index.html). It is also
+available as
+[PDF](https://readthedocs.org/projects/evil/downloads/pdf/latest/) and
+as [EPUB](https://readthedocs.org/projects/evil/downloads/epub/latest/).
+
+# Mailing list
+
+Evil is discussed at the
+[gmane.emacs.vim-emulation](http://lists.ourproject.org/cgi-bin/mailman/listinfo/implementations-list)
+mailing list.
+
+# IRC
+
+Visit us on `irc.libera.chat #evil-mode`.
+
+# Contribution
+
+See
+[CONTRIBUTING.md](https://github.com/emacs-evil/evil/blob/master/CONTRIBUTING.md)
+for guidelines for issues and pull requests.
diff --git a/elpa/evil-1.15.0/dir b/elpa/evil-1.15.0/dir
new file mode 100644
index 0000000..b3717a5
--- /dev/null
+++ b/elpa/evil-1.15.0/dir
@@ -0,0 +1,18 @@
+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-1.15.0/doc/Makefile b/elpa/evil-1.15.0/doc/Makefile
new file mode 100644
index 0000000..d0c3cbf
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/Makefile
@@ -0,0 +1,20 @@
+# Minimal makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line, and also
+# from the environment for the first two.
+SPHINXOPTS ?=
+SPHINXBUILD ?= sphinx-build
+SOURCEDIR = source
+BUILDDIR = build
+
+# Put it first so that "make" without argument is like "make help".
+help:
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+
+.PHONY: help Makefile
+
+# Catch-all target: route all unknown targets to Sphinx using the new
+# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
+%: Makefile
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
diff --git a/elpa/evil-1.15.0/doc/build/texinfo/evil.texi b/elpa/evil-1.15.0/doc/build/texinfo/evil.texi
new file mode 100644
index 0000000..3344e5f
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/build/texinfo/evil.texi
@@ -0,0 +1,2271 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename evil.info
+@documentencoding UTF-8
+@ifinfo
+@*Generated by Sphinx 4.3.2.@*
+@end ifinfo
+@settitle Evil documentation
+@defindex ge
+@paragraphindent 0
+@exampleindent 4
+@finalout
+@dircategory Emacs
+@direntry
+* evil: (evil.info). Extensible vi layer for Emacs
+@end direntry
+
+@definfoenclose strong,`,'
+@definfoenclose emph,`,'
+@c %**end of header
+
+@copying
+@quotation
+Evil 1.15.0, Jan 07, 2022
+
+Eivind Fonn, Frank Fischer, Vegard Øye
+
+Copyright @copyright{} 2011-2019, Eivind Fonn, Frank Fischer, Vegard Øye
+@end quotation
+
+@end copying
+
+@titlepage
+@title Evil documentation
+@insertcopying
+@end titlepage
+@contents
+
+@c %** start of user preamble
+
+@c %** end of user preamble
+
+@ifnottex
+@node Top
+@top Evil documentation
+@insertcopying
+@end ifnottex
+
+@c %**start of body
+@anchor{index doc}@anchor{44}
+@c Evil documentation master file, created by
+@c sphinx-quickstart on Thu Dec 12 10:34:49 2019.
+@c You can adapt this file completely to your liking, but it should at least
+@c contain the root `toctree` directive.
+
+@menu
+* Overview::
+* Settings::
+* Keymaps::
+* Hooks::
+* Extension::
+* Frequently Asked Questions::
+* Internals::
+* The GNU Free Documentation License::
+* Emacs lisp functions and variables::
+
+@detailmenu
+ --- 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::
+
+@end detailmenu
+@end menu
+
+@node Overview,Settings,Top,Top
+@anchor{overview doc}@anchor{45}@anchor{overview evil}@anchor{46}@anchor{overview overview}@anchor{47}
+@chapter Overview
+
+
+Evil is an extensible vi layer for Emacs. It emulates the main
+features of Vim, @footnote{@w{(1)}
+Vim is the most popular version of @emph{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 @uref{https://vim.org,the official Vim website}.
+} 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::
+
+@end menu
+
+@node Installation via package el,Manual installation,,Overview
+@anchor{overview installation-via-package-el}@anchor{48}
+@section Installation via package.el
+
+
+Evil is available as a package from MELPA stable, MELPA unstable and
+NonGNU ELPA. This is the recommended way of installing Evil.
+
+To set up @cite{package.el} to work with one of the MELPA repositories, you
+can follow the instructions on melpa.org@footnote{https://melpa.org/#/getting-started}.
+
+Alternatively you can use NonGNU ELPA. It is part of the default
+package archives as of Emacs 28. For older Emacs versions you’ll need
+to add it yourself:
+
+@example
+(add-to-list 'package-archives
+ (cons "nongnu" (format "http%s://elpa.nongnu.org/nongnu/"
+ (if (gnutls-available-p) "s" ""))))
+@end example
+
+Once that is done, you can execute the following commands:
+
+@example
+M-x package-refresh-contents
+M-x package-install RET evil RET
+@end example
+
+Finally, add the following lines to your Emacs init file:
+
+@example
+(require 'evil)
+(evil-mode 1)
+@end example
+
+@node Manual installation,Modes and states,Installation via package el,Overview
+@anchor{overview manual-installation}@anchor{49}
+@section Manual installation
+
+
+First, install @cite{goto-chg} and @cite{cl-lib}. If you have an Emacs version
+of 24.3 or newer, you should already have @cite{cl-lib}.
+
+Evil lives in a git repository. To download Evil, do:
+
+@example
+git clone --depth 1 https://github.com/emacs-evil/evil.git
+@end example
+
+Then add the following lines to your Emacs init file:
+
+@example
+(add-to-list 'load-path "path/to/evil")
+(require 'evil)
+(evil-mode 1)
+@end example
+
+Ensure that your replace @code{path/to/evil} with the actual path to
+where you cloned Evil.
+
+@node Modes and states,,Manual installation,Overview
+@anchor{overview modes-and-states}@anchor{4a}
+@section Modes and states
+
+
+The next time Emacs is started, it will come up in @emph{normal state},
+denoted by @code{<N>} in the mode line. This is where the main vi
+bindings are defined. Note that you can always disable normal state
+with @code{C-z}, which switches to an “Emacs state” (denoted by
+@code{<E>}) in which vi keys are completely disabled. Press @code{C-z}
+again to switch back to normal state.
+
+
+@table @asis
+
+@item state
+
+Evil uses the term @emph{state} for what is called a “mode” in regular vi
+usage, because @emph{modes} are understood in Emacs terms to mean
+something else.
+@end table
+
+Evil defines a number of states by default:
+
+
+@table @asis
+
+@item normal state (@code{<N>})
+
+This is the default “resting state” of Evil, in which the main body
+of vi bindings are defined.
+
+@item insert state (@code{<I>})
+
+This is the state for insertion of text, where non-modified keys
+will insert the corresponding character in the buffer.
+
+@item visual state (@code{<V>})
+
+A state for selecting text regions. Motions are available for
+modifying the selected region, and operators are available for
+acting on it.
+
+@item replace state (@code{<R>})
+
+A special state mostly similar to insert state, except it replaces
+text instead of inserting.
+
+@item operator-pending state (@code{<O>})
+
+A special state entered after launching an operator, but before
+specifying the corresponding motion or text object.
+
+@item motion state (@code{<M>})
+
+A special state useful for buffers that are read-only, where motions
+are available but editing operations are not.
+
+@item Emacs state (@code{<E>})
+
+A state that as closely as possible mimics default Emacs behaviour,
+by eliminating all vi bindings, except for @code{C-z}, to re-enter
+normal state.
+@end table
+
+@node Settings,Keymaps,Overview,Top
+@anchor{settings doc}@anchor{4b}@anchor{settings settings}@anchor{4c}
+@chapter 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:
+
+@example
+M-x customize-group RET evil RET
+@end example
+
+To change the value of a variable, you can use this interface, or add
+a @code{setq} form to your Emacs init file, preferably before Evil is
+loaded. @footnote{@w{(1)}
+Strictly speaking, the order only matters if the variable
+affects the way Evil is loaded. This is the case with some
+variables.
+}
+
+@example
+(setq evil-shift-width 0)
+;; Load Evil
+(require 'evil)
+@end example
+
+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::
+
+@end menu
+
+@node The initial state,Keybindings and other behaviour,,Settings
+@anchor{settings the-initial-state}@anchor{4d}
+@section 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
+@ref{30,,evil-set-initial-state}.
+
+@anchor{settings elispobj-evil-set-initial-state}@anchor{30}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}set@w{-}initial@w{-}state MODE STATE)
+
+Set the initial state for major mode @emph{MODE} to @emph{STATE}.
+This is the state the buffer comes up in.
+@end deffn
+
+If no state can be found, Evil uses the default initial state.
+
+@anchor{settings elispobj-evil-default-state}@anchor{d}
+@deffn {Emacs Lisp Autovariable} evil@w{-}default@w{-}state
+
+The default Evil state.
+This is the state a buffer starts in when it is not otherwise
+configured (see @ref{30,,evil-set-initial-state} and
+@ref{5,,evil-buffer-regexps}). The value may be one of @code{normal},
+@code{insert}, @code{visual}, @code{replace}, @code{operator}, @code{motion} and @code{emacs}.
+
+Default: @code{normal}
+@end deffn
+
+Alternatively, it is possible to select the initial state based on the
+buffer @emph{name} rather than its major mode. This is checked first, so
+it takes precedence over the other methods for setting the state.
+
+@anchor{settings elispobj-evil-buffer-regexps}@anchor{5}
+@deffn {Emacs Lisp Autovariable} evil@w{-}buffer@w{-}regexps
+
+Regular expressions determining the initial state for a buffer.
+Entries have the form @code{(REGEXP . STATE)}, where @emph{REGEXP} is a regular
+expression matching the buffer’s name and @emph{STATE} is one of @code{normal},
+@code{insert}, @code{visual}, @code{replace}, @code{operator}, @code{motion}, @code{emacs} and
+@code{nil}. If @emph{STATE} is @code{nil}, Evil is disabled in the buffer.
+
+Default: @code{(("^ \\*load\\*"))}
+@end deffn
+
+@node Keybindings and other behaviour,Search,The initial state,Settings
+@anchor{settings keybindings-and-other-behaviour}@anchor{4e}
+@section Keybindings and other behaviour
+
+
+Evil comes with a rich system for modifying its key bindings
+@ref{4f,,Keymaps}. For the most common tweaks, the following
+variables are available.
+
+@anchor{settings elispobj-evil-toggle-key}@anchor{37}
+@deffn {Emacs Lisp Autovariable} evil@w{-}toggle@w{-}key
+
+The key used to change to and from Emacs state.
+Must be readable by @code{read-kbd-macro}. For example: “C-z”.
+
+Default: @code{"C-z"}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-i-jump}@anchor{3c}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}i@w{-}jump
+
+Whether @code{C-i} jumps forward in the jump list (like Vim).
+Otherwise, @code{C-i} inserts a tab character.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-u-delete}@anchor{3d}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}u@w{-}delete
+
+Whether @code{C-u} deletes back to indentation in insert state.
+Otherwise, @code{C-u} applies a prefix argument. The binding of
+@code{C-u} mirrors Emacs behaviour by default due to the relative
+ubiquity of prefix arguments.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-u-scroll}@anchor{3e}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}u@w{-}scroll
+
+Whether @code{C-u} scrolls up (like Vim).
+Otherwise, @code{C-u} applies a prefix argument. The binding of
+@code{C-u} mirrors Emacs behaviour by default due to the relative
+ubiquity of prefix arguments.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-d-scroll}@anchor{3b}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}d@w{-}scroll
+
+Whether @code{C-d} scrolls down (like Vim).
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-w-delete}@anchor{3f}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}w@w{-}delete
+
+Whether @code{C-w} deletes a word in Insert state.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-want-C-w-in-emacs-state}@anchor{40}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}C@w{-}w@w{-}in@w{-}emacs@w{-}state
+
+Whether @code{C-w} prefixes windows commands in Emacs state.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-want-Y-yank-to-eol}@anchor{43}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}Y@w{-}yank@w{-}to@w{-}eol
+
+Whether @code{Y} yanks to the end of the line.
+The default behavior is to yank the whole line, like Vim.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-disable-insert-state-bindings}@anchor{15}
+@deffn {Emacs Lisp Autovariable} evil@w{-}disable@w{-}insert@w{-}state@w{-}bindings
+
+Whether insert state bindings should be used.
+Bindings for escape, delete and @ref{37,,evil-toggle-key} are always
+available. If this is non-nil, default Emacs bindings are by and
+large accessible in insert state.
+
+Default: @code{nil}
+@end deffn
+
+@node Search,Indentation,Keybindings and other behaviour,Settings
+@anchor{settings search}@anchor{50}
+@section Search
+
+
+@anchor{settings elispobj-evil-search-module}@anchor{2a}
+@deffn {Emacs Lisp Autovariable} evil@w{-}search@w{-}module
+
+The search module to be used. May be either @code{isearch}, for
+Emacs’ isearch module, or @code{evil-search}, for Evil’s own
+interactive search module. N.b. changing this will not affect keybindings.
+To swap out relevant keybindings, see @code{evil-select-search-module} function.
+
+Default: @code{isearch}
+@end deffn
+
+@anchor{settings elispobj-evil-regexp-search}@anchor{27}
+@deffn {Emacs Lisp Autovariable} evil@w{-}regexp@w{-}search
+
+Whether to use regular expressions for searching in @code{/} and @code{?}.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-search-wrap}@anchor{2b}
+@deffn {Emacs Lisp Autovariable} evil@w{-}search@w{-}wrap
+
+Whether search with @code{/} and @code{?} wraps around the buffer.
+If this is non-nil, search stops at the buffer boundaries.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-flash-delay}@anchor{19}
+@deffn {Emacs Lisp Autovariable} evil@w{-}flash@w{-}delay
+
+Time in seconds to flash search matches after @code{n} and @code{N}.
+
+Default: @code{2}
+@end deffn
+
+@anchor{settings elispobj-evil-ex-hl-update-delay}@anchor{18}
+@deffn {Emacs Lisp Autovariable} evil@w{-}ex@w{-}hl@w{-}update@w{-}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: @code{0.02}
+@end deffn
+
+@node Indentation,Cursor movement,Search,Settings
+@anchor{settings indentation}@anchor{51}
+@section Indentation
+
+
+@anchor{settings elispobj-evil-auto-indent}@anchor{2}
+@deffn {Emacs Lisp Autovariable} evil@w{-}auto@w{-}indent
+
+Whether to auto-indent when opening lines with @code{o} and @code{O}.
+
+Default: @code{t}, buffer-local
+@end deffn
+
+@anchor{settings elispobj-evil-shift-width}@anchor{33}
+@deffn {Emacs Lisp Autovariable} evil@w{-}shift@w{-}width
+
+The number of columns by which a line is shifted.
+This applies to the shifting operators @code{>} and @code{<}.
+
+Default: @code{4}, buffer-local
+@end deffn
+
+@anchor{settings elispobj-evil-shift-round}@anchor{32}
+@deffn {Emacs Lisp Autovariable} evil@w{-}shift@w{-}round
+
+Whether shifting rounds to the nearest multiple.
+If non-nil, @code{>} and @code{<} adjust line
+indentation to the nearest multiple of @ref{33,,evil-shift-width}.
+
+Default: @code{t}, buffer-local
+@end deffn
+
+@anchor{settings elispobj-evil-indent-convert-tabs}@anchor{1e}
+@deffn {Emacs Lisp Autovariable} evil@w{-}indent@w{-}convert@w{-}tabs
+
+If non-nil, the @code{=} operator converts between leading tabs and spaces.
+Whether tabs are converted to spaces or vice versa depends on the
+value of @code{indent-tabs-mode}.
+
+Default: @code{t}
+@end deffn
+
+@node Cursor movement,Cursor display,Indentation,Settings
+@anchor{settings cursor-movement}@anchor{52}
+@section 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 @emph{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.
+
+@anchor{settings elispobj-evil-repeat-move-cursor}@anchor{28}
+@deffn {Emacs Lisp Autovariable} evil@w{-}repeat@w{-}move@w{-}cursor
+
+Whether repeating commands with @code{.} may move the cursor.
+If nil, the original cursor position is preserved, even if the command
+normally would have moved the cursor.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-move-cursor-back}@anchor{26}
+@deffn {Emacs Lisp Autovariable} evil@w{-}move@w{-}cursor@w{-}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: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-move-beyond-eol}@anchor{25}
+@deffn {Emacs Lisp Autovariable} evil@w{-}move@w{-}beyond@w{-}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: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-cross-lines}@anchor{7}
+@deffn {Emacs Lisp Autovariable} evil@w{-}cross@w{-}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 @code{h}, @code{SPC}, @code{f}, @code{F}, @code{t}, @code{T}, @code{~}.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-respect-visual-line-mode}@anchor{29}
+@deffn {Emacs Lisp Autovariable} evil@w{-}respect@w{-}visual@w{-}line@w{-}mode
+
+Whether movement commands respect @code{visual-line-mode}.
+If non-nil, @code{visual-line-mode} is generally respected when it is
+on. In this case, motions such as @code{j} and
+@code{k} navigate by visual lines (on the screen) rather
+than “physical” lines (defined by newline characters). If nil,
+the setting of @code{visual-line-mode} is ignored.
+
+This variable must be set before Evil is loaded.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-track-eol}@anchor{38}
+@deffn {Emacs Lisp Autovariable} evil@w{-}track@w{-}eol
+
+Whether @code{$} “sticks” the cursor to the end of the line.
+If non-nil, vertical motions after @code{$} maintain the cursor at the
+end of the line, even if the target line is longer. This is analogous
+to @code{track-eol}, but respects Evil’s interpretation of end-of-line.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-start-of-line}@anchor{36}
+@deffn {Emacs Lisp Autovariable} evil@w{-}start@w{-}of@w{-}line
+
+Analogue of vim’s @code{startofline}.
+If nil, preserve column when making relevant movements of the cursor.
+Otherwise, move the cursor to the start of the line.
+
+Default: @code{nil}
+@end deffn
+
+@node Cursor display,Window management,Cursor movement,Settings
+@anchor{settings cursor-display}@anchor{53}
+@section Cursor display
+
+
+A state may change the appearance of the cursor. Use the variable
+@ref{c,,evil-default-cursor} to set the default cursor, and the
+variables @code{evil-normal-state-cursor}, @code{evil-insert-state-cursor}
+etc. to set the cursors for specific states. The acceptable values
+for all of them are the same.
+
+@anchor{settings elispobj-evil-default-cursor}@anchor{c}
+@deffn {Emacs Lisp Autovariable} evil@w{-}default@w{-}cursor
+
+The default cursor.
+May be a cursor type as per @code{cursor-type}, a color string as passed
+to @code{set-cursor-color}, a zero-argument function for changing the
+cursor, or a list of the above.
+
+Default: @code{t}
+@end deffn
+
+@node Window management,Parenthesis highlighting,Cursor display,Settings
+@anchor{settings window-management}@anchor{54}
+@section Window management
+
+
+@anchor{settings elispobj-evil-auto-balance-windows}@anchor{1}
+@deffn {Emacs Lisp Autovariable} evil@w{-}auto@w{-}balance@w{-}windows
+
+If non-nil window creation and deletion trigger rebalancing.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-split-window-below}@anchor{35}
+@deffn {Emacs Lisp Autovariable} evil@w{-}split@w{-}window@w{-}below
+
+If non-nil split windows are created below.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-vsplit-window-right}@anchor{3a}
+@deffn {Emacs Lisp Autovariable} evil@w{-}vsplit@w{-}window@w{-}right
+
+If non-nil vertically split windows with are created to the right.
+
+Default: @code{nil}
+@end deffn
+
+@node Parenthesis highlighting,Miscellaneous,Window management,Settings
+@anchor{settings parenthesis-highlighting}@anchor{55}
+@section Parenthesis highlighting
+
+
+These settings concern the integration between Evil and
+@code{show-paren-mode}. They take no effect if this mode is not enabled.
+
+@anchor{settings elispobj-evil-show-paren-range}@anchor{34}
+@deffn {Emacs Lisp Autovariable} evil@w{-}show@w{-}paren@w{-}range
+
+The minimal distance between point and a parenthesis
+which causes the parenthesis to be highlighted.
+
+Default: @code{0}
+@end deffn
+
+@anchor{settings elispobj-evil-highlight-closing-paren-at-point-states}@anchor{1d}
+@deffn {Emacs Lisp Autovariable} evil@w{-}highlight@w{-}closing@w{-}paren@w{-}at@w{-}point@w{-}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 @code{not} then its meaning is inverted,
+i.e. all states listed here highlight the closing parenthesis
+before point.
+
+Default: @code{(not emacs insert replace)}
+@end deffn
+
+@node Miscellaneous,,Parenthesis highlighting,Settings
+@anchor{settings miscellaneous}@anchor{56}
+@section Miscellaneous
+
+
+@anchor{settings elispobj-evil-want-fine-undo}@anchor{42}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}fine@w{-}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 @code{fine} is
+interpreted as @code{nil}. This option was removed because it did not
+work consistently.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-undo-system}@anchor{39}
+@deffn {Emacs Lisp Autovariable} evil@w{-}undo@w{-}system
+
+Undo system Evil should use. If equal to @code{undo-tree} or
+@code{undo-fu}, those packages must be installed. If equal to
+@code{undo-tree}, @code{undo-tree-mode} must also be activated. If equal
+to @code{undo-redo}, Evil uses commands natively available in Emacs 28.
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-backspace-join-lines}@anchor{3}
+@deffn {Emacs Lisp Autovariable} evil@w{-}backspace@w{-}join@w{-}lines
+
+Whether backward delete in insert state may join lines.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-kbd-macro-suppress-motion-error}@anchor{20}
+@deffn {Emacs Lisp Autovariable} evil@w{-}kbd@w{-}macro@w{-}suppress@w{-}motion@w{-}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 @code{h} and @code{SPC}
+respectively. This may be desired since such errors cause macro
+definition or execution to be terminated. There are four
+possibilities:
+
+
+@itemize -
+
+@item
+@code{record}: errors are suppressed when recording macros, but not when
+replaying them.
+
+@item
+@code{replay}: errors are suppressed when replaying macros, but not when
+recording them.
+
+@item
+@code{t}: errors are suppressed in both cases.
+
+@item
+@code{nil}: errors are never suppressed.
+@end itemize
+
+Default: @code{nil}
+@end deffn
+
+@anchor{settings elispobj-evil-mode-line-format}@anchor{23}
+@deffn {Emacs Lisp Autovariable} evil@w{-}mode@w{-}line@w{-}format
+
+The position of the state tag in the mode line.
+If set to @code{before} or @code{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 @code{(WHERE . WHICH)}, where
+@emph{WHERE} is either @code{before} or @code{after}, and @emph{WHICH} is a symbol in
+@code{mode-line-format}. The tag is then placed before or after that
+symbol, respectively.
+
+Default: @code{before}
+@end deffn
+
+@anchor{settings elispobj-evil-mouse-word}@anchor{24}
+@deffn {Emacs Lisp Autovariable} evil@w{-}mouse@w{-}word
+
+The @emph{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 @code{evil-word} or @code{evil-WORD}.
+
+Default: @code{evil-word}
+@end deffn
+
+@anchor{settings elispobj-evil-bigword}@anchor{4}
+@deffn {Emacs Lisp Autovariable} evil@w{-}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: @code{"^ \t\r\n"}, buffer-local
+@end deffn
+
+@anchor{settings elispobj-evil-esc-delay}@anchor{17}
+@deffn {Emacs Lisp Autovariable} evil@w{-}esc@w{-}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 @code{ESC}. Otherwise, it is translated according to
+@code{input-decode-map}. This does not apply in Emacs state, and may
+also be inhibited by setting @code{evil-inhibit-esc}.
+
+Default: @code{0.01}
+@end deffn
+
+@anchor{settings elispobj-evil-intercept-esc}@anchor{1f}
+@deffn {Emacs Lisp Autovariable} evil@w{-}intercept@w{-}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
+@code{input-decode-map}. It is not necessary to do this in a graphical
+Emacs session. However, if you prefer to use @code{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
+@code{always}, t (only in the terminal) or nil (never intercept).
+
+Default: @code{always}
+@end deffn
+
+@anchor{settings elispobj-evil-kill-on-visual-paste}@anchor{21}
+@deffn {Emacs Lisp Autovariable} evil@w{-}kill@w{-}on@w{-}visual@w{-}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: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-echo-state}@anchor{16}
+@deffn {Emacs Lisp Autovariable} evil@w{-}echo@w{-}state
+
+Whether to signal the current state in the echo area.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-complete-all-buffers}@anchor{6}
+@deffn {Emacs Lisp Autovariable} evil@w{-}complete@w{-}all@w{-}buffers
+
+Whether completion looks for matches in all buffers.
+This applies to @code{C-n} and @code{C-p} in insert state.
+
+Default: @code{t}
+@end deffn
+
+@anchor{settings elispobj-evil-want-empty-ex-last-command}@anchor{41}
+@deffn {Emacs Lisp Autovariable} evil@w{-}want@w{-}empty@w{-}ex@w{-}last@w{-}command
+
+Whether to default to evil-ex-previous-command at empty ex prompt.
+
+Default: @code{t}
+@end deffn
+
+@node Keymaps,Hooks,Settings,Top
+@anchor{keymaps doc}@anchor{57}@anchor{keymaps chapter-keymaps}@anchor{4f}@anchor{keymaps keymaps}@anchor{58}
+@chapter Keymaps
+
+
+Evil’s key bindings are stored in a number of different keymaps. Each
+state has a @emph{global keymap}, where the default bindings for that state
+are stored. They are named @code{evil-normal-state-map},
+@code{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 @code{define-key}:
+
+@example
+(define-key evil-normal-state-map (kbd "w") 'some-function)
+@end example
+
+This binds the key @code{w} to the command @code{some-function} in normal
+state. The use of @code{kbd} is optional for simple key sequences, like
+this one, but recommended in general.
+
+Most of Evil’s bindings are defined in the file @code{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 @emph{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
+@code{evil-normal-state-local-map}, @code{evil-insert-state-local-map}, and
+so on.
+
+@example
+(add-hook 'some-mode-hook
+ (lambda ()
+ (define-key evil-normal-state-local-map
+ (kbd "w") 'some-function)))
+@end example
+
+For convenience, the functions @ref{1c,,evil-global-set-key} and
+@ref{22,,evil-local-set-key} are available for setting global and
+local state keys.
+
+@anchor{keymaps elispobj-evil-global-set-key}@anchor{1c}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}global@w{-}set@w{-}key STATE KEY DEF)
+
+Bind @emph{KEY} to @emph{DEF} in @emph{STATE}.
+@end deffn
+
+@anchor{keymaps elispobj-evil-local-set-key}@anchor{22}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}local@w{-}set@w{-}key STATE KEY DEF)
+
+Bind @emph{KEY} to @emph{DEF} in @emph{STATE} in the current buffer.
+@end deffn
+
+The above examples could therefore have been written as follows:
+
+@example
+(evil-global-set-key 'normal (kbd "w") 'some-function)
+
+(add-hook 'some-mode-hook
+ (lambda ()
+ (evil-local-set-key 'normal (kbd "w") 'some-function)))
+@end example
+
+@menu
+* evil-define-key::
+* Leader keys::
+
+@end menu
+
+@node evil-define-key,Leader keys,,Keymaps
+@anchor{keymaps evil-define-key}@anchor{59}
+@section evil-define-key
+
+
+Evil provides the macro @ref{f,,evil-define-key} 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.
+
+@anchor{keymaps elispobj-evil-define-key}@anchor{f}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}key STATE KEYMAP KEY DEF [BINDINGS...])
+
+Create a @emph{STATE} binding from @emph{KEY} to @emph{DEF} for @emph{KEYMAP}.
+@emph{STATE} is one of @code{normal}, @code{insert}, @code{visual}, @code{replace},
+@code{operator}, @code{motion}, @code{emacs}, or a list of one or more of
+these. Omitting a state by using @code{nil} corresponds to a standard
+Emacs binding using @code{define-key}. The remaining arguments are
+like those of @code{define-key}. For example:
+
+@example
+(evil-define-key 'normal foo-map "a" 'bar)
+@end example
+
+This creates a binding from @code{a} to @code{bar} in normal state, which
+is active whenever @code{foo-map} is active. Using nil for the state,
+the following lead to identical bindings:
+
+@example
+(evil-define-key nil foo-map "a" 'bar)
+(define-key foo-map "a" 'bar)
+@end example
+
+It is possible to specify multiple states and/or bindings at
+once:
+
+@example
+(evil-define-key '(normal visual) foo-map
+ "a" 'bar
+ "b" 'foo)
+@end example
+
+If @code{foo-map} has not been initialized yet, this macro adds an
+entry to @code{after-load-functions}, delaying execution as necessary.
+
+@emph{KEYMAP} may also be a quoted symbol. If the symbol is @code{global}, the
+global evil keymap corresponding to the state(s) is used, meaning
+the following lead to identical bindings:
+
+@example
+(evil-define-key 'normal 'global "a" 'bar)
+(evil-global-set-key 'normal "a" 'bar)
+@end example
+
+The symbol @code{local} may also be used, which corresponds to using
+@ref{22,,evil-local-set-key}. If a quoted symbol is used that is not
+@code{global} or @code{local}, it is assumed to be the name of a minor
+mode, in which case @code{evil-define-minor-mode-key} is used.
+@end deffn
+
+There follows a brief overview of the main functions of this macro.
+
+
+@itemize -
+
+@item
+Define a binding in a given state
+
+@example
+(evil-define-key 'state 'global (kbd "key") 'target)
+@end example
+
+@item
+Define a binding in a given state in the current buffer
+
+@example
+(evil-define-key 'state 'local (kbd "key") 'target)
+@end example
+
+@item
+Define a binding in a given state under the @emph{foo-mode} major mode.
+
+@example
+(evil-define-key 'state foo-mode-map (kbd "key") 'target)
+@end example
+
+Note that @code{foo-mode-map} is unquoted, and that this form is safe
+before @code{foo-mode-map} is loaded.
+
+@item
+Define a binding in a given state under the @emph{bar-mode} minor mode.
+
+@example
+(evil-define-key 'state 'bar-mode (kbd "key") 'target)
+@end example
+
+Note that @code{bar-mode} is quoted, and that this form is safe before
+@code{bar-mode} is loaded.
+@end itemize
+
+The macro @ref{f,,evil-define-key} 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
+@code{foo-mode} with normal state bindings for the keys @code{w} and
+@code{e}:
+
+@example
+(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)
+@end example
+
+This minor mode can then be enabled in any buffers where the custom
+bindings are desired:
+
+@example
+(add-hook 'text-mode-hook 'foo-mode) ; enable alongside text-mode
+@end example
+
+@node Leader keys,,evil-define-key,Keymaps
+@anchor{keymaps leader-keys}@anchor{5a}
+@section Leader keys
+
+
+Evil supports a simple implementation of Vim’s @emph{leader} keys. To bind
+a function to a leader key you can use the expression @code{<leader>} in
+a key mapping, e.g.
+
+@example
+(evil-define-key 'normal 'global (kbd "<leader>fs") 'save-buffer)
+@end example
+
+Likewise, you can use the expression @code{<localleader>} to mimic Vim’s
+local leader, which is designed for mode-specific key bindings.
+
+You can use the function @ref{31,,evil-set-leader} to designate
+which key acts as the leader and the local leader.
+
+@anchor{keymaps elispobj-evil-set-leader}@anchor{31}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}set@w{-}leader STATE KEY [LOCALLEADER])
+
+Set @emph{KEY} to trigger leader bindings in @emph{STATE}.
+@emph{KEY} should be in the form produced by @code{kbd}. @emph{STATE} is one of
+@code{normal}, @code{insert}, @code{visual}, @code{replace}, @code{operator}, @code{motion},
+@code{emacs}, a list of one or more of these, or @code{nil}, which means
+all of the above. If @emph{LOCALLEADER} is non-nil, set the local leader
+instead.
+@end deffn
+
+@node Hooks,Extension,Keymaps,Top
+@anchor{hooks doc}@anchor{5b}@anchor{hooks hooks}@anchor{5c}
+@chapter Hooks
+
+
+A @emph{hook} is a list of functions that are executed when certain events
+happen. Hooks are modified with the Emacs function @code{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
+@code{evil-normal-state-exit-hook} and @code{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 @code{evil-next-state} and
+@code{evil-previous-state} contain information about the states being
+switched to and from, respectively.
+
+@node Extension,Frequently Asked Questions,Hooks,Top
+@anchor{extension doc}@anchor{5d}@anchor{extension extension}@anchor{5e}
+@chapter 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::
+
+@end menu
+
+@node Motions,Operators,,Extension
+@anchor{extension motions}@anchor{5f}
+@section Motions
+
+
+A @emph{motion} is a command which moves the cursor, such as @code{w} or
+@code{e}. Motions are defined with the macro
+@ref{10,,evil-define-motion}. Motions not defined in this way
+should be declared with @ref{9,,evil-declare-motion}.
+
+@anchor{extension elispobj-evil-declare-motion}@anchor{9}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}declare@w{-}motion COMMAND)
+
+Declare @emph{COMMAND} to be a movement function.
+This ensures that it behaves correctly in visual state.
+@end deffn
+
+@anchor{extension elispobj-evil-define-motion}@anchor{10}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}motion MOTION (COUNT ARGS...) DOC [[KEY VALUE]...] BODY...)
+
+Define a motion command @emph{MOTION}.
+@emph{ARGS} is a list of arguments. Motions can have any number of
+arguments, but the first (if any) has the predefined meaning of
+count. @emph{BODY} must execute the motion by moving point.
+
+Optional keyword arguments are:
+
+
+@itemize -
+
+@item
+@code{:type} - determines how the motion works after an operator (one of
+@code{inclusive}, @code{line}, @code{block} and @code{exclusive}, or a self-defined
+motion type)
+
+@item
+@code{:jump} - if non-nil, the previous position is stored in the jump
+list, so that it can be restored with @code{C-o}
+@end itemize
+@end deffn
+
+For example, this is a motion that moves the cursor forward by a
+number of characters:
+
+@example
+(evil-define-motion foo-forward (count)
+ "Move to the right by COUNT characters."
+ :type inclusive
+ (forward-char (or count 1)))
+@end example
+
+The @emph{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.
+
+@node Operators,Text objects,Motions,Extension
+@anchor{extension operators}@anchor{60}
+@section Operators
+
+
+An operator is a command that acts on the text moved over by a motion,
+such as @code{c} (change), @code{d} (delete) or @code{y} (yank or
+copy, not to be confused with “yank” in Emacs terminology which means
+@emph{paste}).
+
+@anchor{extension elispobj-evil-define-operator}@anchor{11}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}operator OPERATOR (BEG END ARGS...) DOC [[KEY VALUE]...] BODY...)
+
+Define an operator command @emph{OPERATOR}.
+The operator acts on the range of characters @emph{BEG} through
+@emph{END}. @emph{BODY} must execute the operator by potentially manipulating
+the buffer contents, or otherwise causing side effects to happen.
+
+Optional keyword arguments are:
+
+
+@itemize -
+
+@item
+@code{:type} - force the input range to be of a given type (@code{inclusive},
+@code{line}, @code{block}, and @code{exclusive}, or a self-defined motion type).
+
+@item
+@code{: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.
+
+@item
+@code{:repeat} - if non-nil (default), then @code{.} will repeat the
+operator.
+
+@item
+@code{:move-point} - if non-nil (default), the cursor will be moved to
+the beginning of the range before the body executes
+
+@item
+@code{: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.
+@end itemize
+@end deffn
+
+For example, this is an operator that performs ROT13 encryption on the
+text under consideration:
+
+@example
+(evil-define-operator evil-rot13 (beg end)
+ "ROT13 encrypt text."
+ (rot13-region beg end))
+@end example
+
+Binding this to @code{g?} (where it is by default) will cause a key
+sequence such as @code{g?w} to encrypt from the current cursor to the
+end of the word.
+
+@node Text objects,Range types,Operators,Extension
+@anchor{extension text-objects}@anchor{61}
+@section 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 @code{evil-inner-text-ojects-map} and
+@code{evil-outer-text-objects-map}, which are available in visual and
+operator-pending state under the keys @code{i} and @code{a}
+respectively.
+
+@anchor{extension elispobj-evil-define-text-object}@anchor{13}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}text@w{-}object OBJECT (COUNT) DOC [[KEY VALUE]...] BODY...)
+
+Define a text object command @emph{OBJECT}.
+@emph{BODY} should return a range @code{(BEG END)} to the right of point
+if @emph{COUNT} is positive, and to the left of it if negative.
+
+Optional keyword arguments:
+
+
+@itemize -
+
+@item
+@code{:type} - determines how the range applies after an operator
+(@code{inclusive}, @code{line}, @code{block}, and @code{exclusive}, or a self-defined
+motion type).
+
+@item
+@code{:extend-selection} - if non-nil (default), the text object always
+enlarges the current selection. Otherwise, it replaces the current
+selection.
+@end itemize
+@end deffn
+
+For eample, this is a text object which selects the next three
+characters after the current location:
+
+@example
+(evil-define-text-object foo (count)
+ "Select three characters."
+ (list (point) (+ 3 (point))))
+@end example
+
+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 @emph{count} selects text after the
+current location, while negative @emph{count} selects text before it.
+
+@cartouche
+@quotation Note
+The @emph{thingatpt} library is used quite extensively in Evil to define
+text objects, and this dependency leaks through in the following
+functions. A @emph{thing} in this context is any symbol for which there
+is a function called @code{forward-THING} @footnote{@w{(1)}
+There are many more ways that a @emph{thing} can be defined,
+but the definition of @code{forward-THING} is perhaps the most
+straightforward way to go about it.
+} which moves past a
+number of @emph{things}.
+@end quotation
+@end cartouche
+
+@anchor{extension elispobj-evil-select-inner-object}@anchor{2d}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}select@w{-}inner@w{-}object THING BEG END TYPE [COUNT LINE])
+
+Return an inner text object range of @emph{COUNT} objects.
+If @emph{COUNT} is positive, return objects following point; if @emph{COUNT} is
+negative, return objects preceding point. If one is unspecified,
+the other is used with a negative argument. @emph{THING} is a symbol
+understood by @emph{thing-at-point}. @emph{BEG}, @emph{END} and @emph{TYPE} specify the
+current selection. If @emph{LINE} is non-nil, the text object should be
+linewise, otherwise it is character wise.
+@end deffn
+
+@anchor{extension elispobj-evil-select-an-object}@anchor{2c}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}select@w{-}an@w{-}object THING BEG END TYPE COUNT [LINE])
+
+Return an outer text object range of @emph{COUNT} objects.
+If @emph{COUNT} is positive, return objects following point; if @emph{COUNT} is
+negative, return objects preceding point. If one is unspecified,
+the other is used with a negative argument. @emph{THING} is a symbol
+understood by @emph{thing-at-point}. @emph{BEG}, @emph{END} and @emph{TYPE} specify the
+current selection. If @emph{LINE} is non-nil, the text object should be
+linewise, otherwise it is character wise.
+@end deffn
+
+@anchor{extension elispobj-evil-select-paren}@anchor{2e}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}select@w{-}paren OPEN CLOSE BEG END TYPE COUNT [INCLUSIVE])
+
+Return a range @code{(BEG END)} of @emph{COUNT} delimited text objects.
+@emph{OPEN} and @emph{CLOSE} specify the opening and closing delimiter,
+respectively. @emph{BEG} @emph{END} @emph{TYPE} are the currently selected (visual)
+range. If @emph{INCLUSIVE} is non-nil, @emph{OPEN} and @emph{CLOSE} are included in
+the range; otherwise they are excluded.
+
+The types of @emph{OPEN} and @emph{CLOSE} specify which kind of THING is used
+for parsing with @code{evil-select-block}. If @emph{OPEN} and @emph{CLOSE} are
+characters @code{evil-up-paren} is used. Otherwise @emph{OPEN} and @emph{CLOSE}
+must be regular expressions and @code{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.
+@end deffn
+
+@node Range types,States,Text objects,Extension
+@anchor{extension range-types}@anchor{62}
+@section Range types
+
+
+A @emph{type} is a transformation acting on a pair of buffer positions.
+Evil defines the types @code{inclusive}, @code{line}, @code{block} and
+@code{exclusive}, which are used for motion ranges and visual selection.
+New types may be defined with the macro @emph{evil-define-type}.
+
+@anchor{extension elispobj-evil-define-type}@anchor{14}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}type TYPE DOC [[KEY FUNC]...])
+
+Define type @emph{TYPE}.
+@emph{DOC} is a general description and shows up in all docstrings.
+
+Optional keyword arguments:
+
+
+@itemize -
+
+@item
+@code{:expand} - expansion function. This function should accept two
+positions in the current buffer, BEG and END,and return a pair of
+expanded buffer positions.
+
+@item
+@code{:contract} - the opposite of @code{:expand}. Optional.
+
+@item
+@code{:one-to-one} - non-nil if expansion is one-to-one. This means that
+@code{:expand} followed by @code{:contract} always return the original range.
+
+@item
+@code{:normalize} - normalization function. This function should accept
+two unexpanded positions and adjust them before expansion. May be
+used to deal with buffer boundaries.
+
+@item
+@code{:string} - description function. Takes two buffer positions and
+returns a human-readable string. For example “2 lines”
+@end itemize
+
+If further keywords and functions are specified, they are assumed to
+be transformations on buffer positions, like @code{:expand} and @code{:contract}.
+@end deffn
+
+@node States,,Range types,Extension
+@anchor{extension states}@anchor{63}
+@section States
+
+
+States are defined with the macro @ref{12,,evil-define-state},
+which takes care to define the necessary hooks, keymaps and variables,
+as well as a toggle function @code{evil-NAME-state} and a predicate
+function @code{evil-NAME-state-p} for checking whether the state is
+active.
+
+@anchor{extension elispobj-evil-define-state}@anchor{12}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}state STATE DOC [[KEY VAL]...] BODY...)
+
+Define an Evil state @emph{STATE}.
+@emph{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.
+
+@emph{BODY} is executed each time the state is enabled or disabled.
+
+Optional keyword arguments:
+
+
+@itemize -
+
+@item
+@code{:tag} - the mode line indicator, e.g. “<T>”.
+
+@item
+@code{:message} - string shown in the echo area when the state is
+activated.
+
+@item
+@code{:cursor} - default cursor specification.
+
+@item
+@code{:enable} - list of other state keymaps to enable when in this
+state.
+
+@item
+@code{:entry-hook} - list of functions to run when entering this state.
+
+@item
+@code{:exit-hook} - list of functions to run when exiting this state.
+
+@item
+@code{:suppress-keymap} - if non-nil, effectively disables bindings to
+@code{self-insert-command} by making @code{evil-suppress-map} the parent of
+the global state keymap.
+@end itemize
+
+The global keymap of this state will be @code{evil-test-state-map},
+the local keymap will be @code{evil-test-state-local-map}, and so on.
+@end deffn
+
+For example:
+
+@example
+(evil-define-state test
+ "Test state."
+ :tag " <T> "
+ (message (if (evil-test-state-p)
+ "Enabling test state."
+ "Disabling test state.")))
+@end example
+
+@node Frequently Asked Questions,Internals,Extension,Top
+@anchor{faq doc}@anchor{64}@anchor{faq frequently-asked-questions}@anchor{65}
+@chapter Frequently Asked Questions
+
+
+@menu
+* Problems with the escape key in the terminal::
+* Underscore is not a word character::
+
+@end menu
+
+@node Problems with the escape key in the terminal,Underscore is not a word character,,Frequently Asked Questions
+@anchor{faq problems-with-the-escape-key-in-the-terminal}@anchor{66}
+@section 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
+@code{M-<key>} instead of two separate keys: @code{ESC} followed by
+@code{<key>}. In fact, it is perfectly valid to simulate
+@code{M-<key>} by pressing @code{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 @code{ESC} and the second the key pressed simultaneously. The
+problem is that pressing the escape key itself also generates the
+@code{ESC} event. Thus, if Emacs (and therefore Evil) receives an
+@code{ESC} event there is no way to tell whether the escape key has
+been pressed (and no further event will arrive) or a @code{M-<key>}
+combination has been pressed (and the @code{<key>} event will arrive
+soon). In order to distinguish both situations Evil does the
+following. After receiving an @code{ESC} event Evil waits for a short
+time period (specified by the variable @ref{17,,evil-esc-delay}
+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 @code{M-<key>} combination has been pressed and
+combines the @code{ESC} event with the second one. Because a
+@code{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 @emph{tmux} or @emph{screen} the
+situation may be worse. These multiplexers have exactly the same
+problem recognizing @code{M-<key>} sequences and often introduce their
+own delay for the @code{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 @code{escape} (a symbol) and hence Evil can
+distinguish whether the escape key or a @code{M-<key>} combination has
+been pressed. But this also implies that pressing @code{ESC} followed
+by <key> cannot be used to simulate @code{M-<key>} in graphical mode!
+
+@node Underscore is not a word character,,Problems with the escape key in the terminal,Frequently Asked Questions
+@anchor{faq underscore-is-not-a-word-character}@anchor{67}
+@section Underscore is not a word character
+
+
+An underscore @code{_} is a word character in Vim. This means that word
+motions like @code{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. @code{+}.
+
+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 @code{[:word:]}.
+
+If you would be satisfied by having the @code{*} and @code{#} searches
+use symbols instead of words, this can be achieved by setting the
+@code{evil-symbol-word-search} variable to @code{t}.
+
+If you want the underscore to be recognised as word character for other
+motions, you can modify its entry in the syntax-table:
+
+@example
+(modify-syntax-entry ?_ "w")
+@end example
+
+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.:
+
+@example
+(add-hook 'c-mode-common-hook
+ (lambda () (modify-syntax-entry ?_ "w")))
+@end example
+
+This gives the underscore the word syntax-class in all C-like buffers.
+
+Similarly to Emacs’ definition of a word, the definition of a “symbol” is also
+dependent on the syntax-class of the buffer, which often includes the
+underscore. The default text objects keymap associates kbd::@cite{o} with the symbol
+object, making kbd::@cite{cio} a good alternative to Vim’s kbd::@cite{ciw}, for example.
+The following will swap between the word and symbol objects in the keymap:
+
+@example
+(define-key evil-outer-text-objects-map "w" 'evil-a-symbol)
+(define-key evil-inner-text-objects-map "w" 'evil-inner-symbol)
+(define-key evil-outer-text-objects-map "o" 'evil-a-word)
+(define-key evil-inner-text-objects-map "o" 'evil-inner-word)
+@end example
+
+This will not change the motion keys, however. One way to make word motions
+operate as symbol motions is to alias the @code{evil-word} @emph{thing} @footnote{@w{(1)}
+Many of Evil’s text objects and motions are defined in
+terms of the @emph{thingatpt} library, which in this case are defined
+entirely in terms of @code{forward-THING} functions. Thus aliasing
+one to another should make all motions and text objects implemented
+in terms of that @emph{thing} behave the same.
+} to
+the @code{evil-symbol} thing:
+
+@example
+(defalias 'forward-evil-word 'forward-evil-symbol)
+@end example
+
+@node Internals,The GNU Free Documentation License,Frequently Asked Questions,Top
+@anchor{internals doc}@anchor{68}@anchor{internals internals}@anchor{69}
+@chapter Internals
+
+
+@menu
+* Command properties::
+
+@end menu
+
+@node Command properties,,,Internals
+@anchor{internals command-properties}@anchor{6a}
+@section Command properties
+
+
+Evil defines @emph{command properties} to store information about commands
+@footnote{@w{(1)}
+In this context, a @emph{command} may mean any Evil motion,
+text object, operator or indeed other Emacs commands, which have
+not been defined through the Evil machinery.
+}, such as whether they should be repeated. A command
+property is a @code{:keyword} with an associated value, e.g.
+@code{:repeat nil}.
+
+@anchor{internals elispobj-evil-add-command-properties}@anchor{0}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}add@w{-}command@w{-}properties COMMAND [PROPERTIES...])
+
+Add @emph{PROPERTIES} to @emph{COMMAND}.
+@emph{PROPERTIES} should be a property list.
+To replace all properties at once, use @ref{2f,,evil-set-command-properties}.
+@end deffn
+
+@anchor{internals elispobj-evil-set-command-properties}@anchor{2f}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}set@w{-}command@w{-}properties COMMAND [PROPERTIES...])
+
+Replace all of @emph{COMMAND}’s properties with @emph{PROPERTIES}.
+@emph{PROPERTIES} should be a property list.
+This erases all previous properties; to only add properties,
+use @code{evil-set-command-property}.
+@end deffn
+
+@anchor{internals elispobj-evil-get-command-properties}@anchor{1a}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}get@w{-}command@w{-}properties COMMAND)
+
+Return all Evil properties of @emph{COMMAND}.
+See also @ref{1b,,evil-get-command-property}.
+@end deffn
+
+@anchor{internals elispobj-evil-get-command-property}@anchor{1b}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}get@w{-}command@w{-}property COMMAND PROPERTY [DEFAULT])
+
+Return the value of Evil @emph{PROPERTY} of @emph{COMMAND}.
+If the command does not have the property, return @emph{DEFAULT}.
+See also @ref{1a,,evil-get-command-properties}.
+@end deffn
+
+@anchor{internals elispobj-evil-define-command}@anchor{e}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}define@w{-}command COMMAND (ARGS...) DOC [[KEY VALUE]...] BODY...)
+
+Define a command @emph{COMMAND}.
+@end deffn
+
+For setting repeat properties, use the following functions:
+
+@anchor{internals elispobj-evil-declare-repeat}@anchor{b}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}declare@w{-}repeat COMMAND)
+
+Declare @emph{COMMAND} to be repeatable.
+@end deffn
+
+@anchor{internals elispobj-evil-declare-not-repeat}@anchor{a}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}declare@w{-}not@w{-}repeat COMMAND)
+
+Declare @emph{COMMAND} to be nonrepeatable.
+@end deffn
+
+@anchor{internals elispobj-evil-declare-change-repeat}@anchor{8}
+@deffn {Emacs Lisp Autofunction} (evil@w{-}declare@w{-}change@w{-}repeat COMMAND)
+
+Declare @emph{COMMAND} to be repeatable by buffer changes rather than
+keystrokes.
+@end deffn
+
+@node The GNU Free Documentation License,Emacs lisp functions and variables,Internals,Top
+@anchor{license doc}@anchor{6b}@anchor{license the-gnu-free-documentation-license}@anchor{6c}
+@chapter The GNU Free Documentation License
+
+
+Version 1.3, 3 November 2008
+
+@quotation
+
+Copyright (c) 2000, 2001, 2002, 2007, 2008 Free Software
+Foundation, Inc. @indicateurl{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies of
+this license document, but changing it is not allowed.
+@end quotation
+
+
+@enumerate 0
+
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @emph{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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+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:
+
+
+@enumerate A
+
+@item
+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.
+
+@item
+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.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+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.
+
+@item
+Preserve in that license notice the full lists of Invariant
+Sections and required Cover Texts given in the Document’s
+license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+Delete any section Entitled “Endorsements”. Such a section may
+not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled
+“Endorsements” or to conflict in title with any Invariant
+Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+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.
+
+@item
+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.”
+
+@item
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+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.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+@end enumerate
+
+@quotation
+
+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
+@indicateurl{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.
+@end quotation
+
+
+@enumerate 11
+
+@item
+RELICENSING
+@end enumerate
+
+@quotation
+
+“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.
+@end quotation
+
+
+@node Emacs lisp functions and variables,,The GNU Free Documentation License,Top
+@unnumbered 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-module: 2a.
+* evil-search-wrap: 2b.
+* evil-select-an-object: 2c.
+* evil-select-inner-object: 2d.
+* evil-select-paren: 2e.
+* evil-set-command-properties: 2f.
+* evil-set-initial-state: 30.
+* evil-set-leader: 31.
+* evil-shift-round: 32.
+* evil-shift-width: 33.
+* evil-show-paren-range: 34.
+* evil-split-window-below: 35.
+* evil-start-of-line: 36.
+* evil-toggle-key: 37.
+* evil-track-eol: 38.
+* evil-undo-system: 39.
+* evil-vsplit-window-right: 3a.
+* evil-want-C-d-scroll: 3b.
+* evil-want-C-i-jump: 3c.
+* evil-want-C-u-delete: 3d.
+* evil-want-C-u-scroll: 3e.
+* evil-want-C-w-delete: 3f.
+* evil-want-C-w-in-emacs-state: 40.
+* evil-want-empty-ex-last-command: 41.
+* evil-want-fine-undo: 42.
+* evil-want-Y-yank-to-eol: 43.
+@end menu
+
+
+@c %**end of body
+@bye
diff --git a/elpa/evil-1.15.0/doc/docstringdb.json b/elpa/evil-1.15.0/doc/docstringdb.json
new file mode 100644
index 0000000..160388d
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/docstringdb.json
@@ -0,0 +1,17584 @@
+{
+ "evil-find-file-at-point-visual": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find the filename selected by the visual region.\n Returns an error message if the file does not exist.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-Y-yank-to-eol": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `Y' yanks to the end of the line.\nThe default behavior is to yank the whole line, like Vim.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-rotate": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "In Visual Block selection, put point in CORNER.\nCorner may be one of `upper-left', `upper-right', `lower-left'\nand `lower-right':\n\n upper-left +---+ upper-right\n | |\n lower-left +---+ lower-right\n\nWhen called interactively, the selection is rotated blockwise.",
+ "arglist": [
+ "corner",
+ "&optional",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-exit-visual-and-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Exit insert state and repeat event.\nThis special command should be used if some command called from\nvisual state should actually be called in normal-state. The main\nreason for doing this is that the repeat system should *not*\nrecord the visual state information for some command. This\ncommand should be bound to exactly the same event in visual state\nas the original command is bound in normal state. EVENT is the\nevent that triggered the execution of this command.",
+ "arglist": [
+ "event"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-current-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The buffer from which the command line window was called.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-selection-for-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a Visual selection for TYPE.",
+ "arglist": [
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-global-inverted": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The Ex vglobal command.\n[BEG,END]vglobal/PATTERN/COMMAND",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "pattern",
+ "command",
+ "invert"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-move-far-right": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Closes the current window, splits the lower-right one vertically\nand redisplays the current buffer there.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-without-input-method-hooks": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute body with evil's activate/deactivate-input-method hooks deactivated.\n\nThis allows input methods to be used in normal-state.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-local-map": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Buffer-local keymap for Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-move-very-bottom": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Closes the current window, splits the lower-right one horizontally\nand redisplays the current buffer there.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-line-move": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "A wrapper for line motions which conserves the column.\nSignals an error at buffer boundaries unless NOERROR is non-nil.",
+ "arglist": [
+ "count",
+ "&optional",
+ "noerror"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-select-an-object": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return an outer text object range of COUNT objects.\nIf COUNT is positive, return objects following point; if COUNT is\nnegative, return objects preceding point. If one is unspecified,\nthe other is used with a negative argument. THING is a symbol\nunderstood by thing-at-point. BEG, END and TYPE specify the\ncurrent selection. If LINE is non-nil, the text object should be\nlinewise, otherwise it is character wise.",
+ "arglist": [
+ "thing",
+ "beg",
+ "end",
+ "type",
+ "count",
+ "&optional",
+ "line"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-text-objects-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for inner text objects.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-inner-symbol": "o",
+ "evil-inner-tag": "t",
+ "evil-inner-back-quote": "`",
+ "evil-inner-double-quote": "\"",
+ "evil-inner-single-quote": "'",
+ "evil-inner-angle": ">",
+ "evil-inner-angle": ">",
+ "evil-inner-curly": "}",
+ "evil-inner-curly": "}",
+ "evil-inner-curly": "}",
+ "evil-inner-bracket": "]",
+ "evil-inner-bracket": "]",
+ "evil-inner-paren": ")",
+ "evil-inner-paren": ")",
+ "evil-inner-paren": ")",
+ "evil-inner-paragraph": "p",
+ "evil-inner-sentence": "s",
+ "evil-inner-WORD": "W",
+ "evil-inner-word": "w"
+ }
+ },
+ "evil-ex-current-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the line number of the current line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-newline-commands": {
+ "default": "(LaTeX-section TeX-font)",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Commands excluding the trailing newline of a Visual Line selection.\nThese commands work better without this newline.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-insertion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last piece of inserted text.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-line-to-center": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls line number COUNT (or the cursor line) to the center of the window.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-undo-entry": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Information about the latest undo entry in the buffer.\nThis should be a pair (OBJ . CONS) where OBJ is the entry as an\nobject, and CONS is a copy of the entry.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-top": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to line COUNT from the top of the window.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-word-0": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-word-0'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-word-1": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-word-1'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-minor-mode-key": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Similar to `evil-define-key' but the bindings are associated\nwith the minor-mode symbol MODE instead of a particular map.\nAssociating bindings with a mode symbol instead of a map allows\nevil to use Emacs' built-in mechanisms to enable the bindings\nautomatically when MODE is active without relying on calling\n`evil-normalize-keymaps'. Another less significant difference is\nthat the bindings can be created immediately, because this\nfunction only uses the symbol MODE and does not rely on its\nvalue.\n\nSee `evil-define-key' for the usage of STATE, KEY, DEF and\nBINDINGS.",
+ "arglist": [
+ "state",
+ "mode",
+ "key",
+ "def",
+ "&rest",
+ "bindings"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-ex-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Called to record a search command.\nFLAG is either 'pre or 'post if the function is called before\nresp. after executing the command.",
+ "arglist": [
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-maybe-remove-spaces": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Flag to determine if newly inserted spaces should be removed.\nSee the function `evil-maybe-remove-spaces'.",
+ "fn-docstring": "Remove space from newly opened empty line.\nThis function removes (indentation) spaces that have been\ninserted by opening a new empty line. The behavior depends on the\nvariable `evil-maybe-remove-spaces'. If this variable is nil the\nfunction does nothing. Otherwise the behavior depends on\nDO-REMOVE. If DO-REMOVE is non-nil the spaces are\nremoved. Otherwise `evil-maybe-remove-spaces' is set to nil\nunless the last command opened yet another new line.\n\nThis function should be added as a post-command-hook to track\ncommands opening a new line.",
+ "arglist": [
+ "&optional",
+ "do-remove"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-get-jumps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "struct"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--self-insert-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Insert STRING as if typed interactively.",
+ "arglist": [
+ "string"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inhibit-operator-value": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "This variable is used to transfer the value\nof `evil-inhibit-operator' from one local scope to another.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-x-select-timer": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Timer for updating the X selection in visual state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-lookup-func": {
+ "default": "woman",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Lookup function used by \"\\<evil-motion-state-map>\\[evil-lookup]\".",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-narrow-to-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Narrow BODY to the current line.\nBODY will signal the errors 'beginning-of-line or 'end-of-line\nupon reaching the beginning or end of the current line.\n\n(fn [[KEY VAL]...] BODY...)",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-space": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-lookup-key": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns non-nil value if KEY is bound in MAP.",
+ "arglist": [
+ "map",
+ "key"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-upcase-first": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return STR with the first letter upcased.",
+ "arglist": [
+ "str"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-repeat-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Record insertion keys in `evil-insert-repeat-info'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-vsplit-window-right": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil vertically split windows with are created to the right.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-respect-visual-line-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-motion-state-map>\nWhether movement commands respect `visual-line-mode'.\nIf non-nil, `visual-line-mode' is generally respected when it is\non. In this case, motions such as \\[evil-next-line] and\n\\[evil-previous-line] navigate by visual lines (on the screen) rather\nthan \"physical\" lines (defined by newline characters). If nil,\nthe setting of `visual-line-mode' is ignored.\n\nThis variable must be set before Evil is loaded.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last substitute pattern.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-abbrev-expand-on-insert-exit": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil abbrevs will be expanded when leaving insert state\nlike in Vim, if `abbrev-mode' is on.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delay": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute FORM when CONDITION becomes true, checking with HOOK.\nNAME specifies the name of the entry added to HOOK. If APPEND is\nnon-nil, the entry is appended to the hook. If LOCAL is non-nil,\nthe buffer-local value of HOOK is modified.",
+ "arglist": [
+ "condition",
+ "form",
+ "hook",
+ "&optional",
+ "append",
+ "local",
+ "name"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jump-item": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find the next item in this line after or under the cursor\nand jump to the corresponding one.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-yank-block-handler": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Inserts the current text as block.",
+ "arglist": [
+ "lines"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-apply-on-block": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Call FUNC for each line of a block selection.\nThe selection is specified by the region BEG and END. FUNC must\ntake at least two arguments, the beginning and end of each\nline. If PASS-COLUMNS is non-nil, these values are the columns,\notherwise tey are buffer positions. Extra arguments to FUNC may\nbe passed via ARGS.",
+ "arglist": [
+ "func",
+ "beg",
+ "end",
+ "pass-columns",
+ "&rest",
+ "args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-replacement": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last substitute replacement.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the line number of BASE plus OFFSET.",
+ "arglist": [
+ "base",
+ "&optional",
+ "offset"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-command-window": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Start command window with ex history and current minibuffer content.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-next": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Complete to the nearest following word.\nSearch backward if a match isn't found.\nCalls `evil-complete-next-func'.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-up-xml-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point to the end or beginning of balanced xml tags.\nOPEN and CLOSE should be characters identifying the opening and\nclosing parenthesis, respectively. If COUNT is greater than zero\npoint is moved forward otherwise it is moved backwards. Whenever\nan opening delimiter is found the COUNT is increased by one, if a\nclosing delimiter is found the COUNT is decreased by one. The\nmotion stops when COUNT reaches zero. The match-data reflects the\nlast successful match (that caused COUNT to reach zero).",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-pattern-regex": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the regular expression of a search PATTERN.",
+ "arglist": [
+ "pattern"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-quote-simple": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-delete-backward-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Close the minibuffer if it is empty.\nOtherwise behaves like `delete-backward-char'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-filter-list": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete by side-effect all items satisfying PREDICATE in LIST.\nStop when reaching POINTER. If the first item satisfies PREDICATE,\nthere is no way to remove it by side-effect; therefore, write\n(setq foo (evil-filter-list 'predicate foo)) to be sure of\nchanging the value of `foo'.",
+ "arglist": [
+ "predicate",
+ "list",
+ "&optional",
+ "pointer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-local-mode-off-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-quit": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Closes the current window, current frame, Emacs.\nIf the current frame belongs to some client the client connection\nis closed.",
+ "arglist": [
+ "&optional",
+ "force"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-find-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the next COUNT'th occurrence of CHAR.\nMovement is restricted to the current line unless `evil-cross-lines' is non-nil.",
+ "arglist": [
+ "&optional",
+ "count",
+ "char"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT lines down.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-parser": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Parse STRING as a SYMBOL in GRAMMAR.\nIf GREEDY is non-nil, the whole of STRING must match.\nIf the parse succeeds, the return value is a cons cell\n(RESULT . TAIL), where RESULT is a parse tree and TAIL is\nthe remainder of STRING. Otherwise, the return value is nil.\n\nGRAMMAR is an association list of symbols and their definitions.\nA definition is either a list of production rules, which are\ntried in succession, or a #'-quoted function, which is called\nto parse the input.\n\nA production rule can be one of the following:\n\n nil matches the empty string.\n A regular expression matches a substring.\n A symbol matches a production for that symbol.\n (X Y) matches X followed by Y.\n (\\? X) matches zero or one of X.\n (* X) matches zero or more of X.\n (+ X) matches one or more of X.\n (& X) matches X, but does not consume.\n (! X) matches anything but X, but does not consume.\n\nThus, a simple grammar may look like:\n\n ((plus \"\\\\+\") ; plus <- \"+\"\n (minus \"-\") ; minus <- \"-\"\n (operator plus minus)) ; operator <- plus / minus\n\nAll input-consuming rules have a value. A regular expression evaluates\nto the text matched, while a list evaluates to a list of values.\nThe value of a list may be overridden with a semantic action, which is\nspecified with a #'-quoted expression at the end:\n\n (X Y #'foo)\n\nThe value of this rule is the result of calling foo with the values\nof X and Y as arguments. Alternatively, the function call may be\nspecified explicitly:\n\n (X Y #'(foo $1 $2))\n\nHere, $1 refers to X and $2 refers to Y. $0 refers to the whole list.\nDollar expressions can also be used directly:\n\n (X Y #'$1)\n\nThis matches X followed by Y, but ignores the value of Y;\nthe value of the list is the same as the value of X.\n\nIf the SYNTAX argument is non-nil, then all semantic actions\nare ignored, and a syntax tree is constructed instead. The\nsyntax tree obeys the property that all the leave nodes are\nparts of the input string. Thus, by traversing the syntax tree,\none can determine how each character was parsed.\n\nThe following symbols have reserved meanings within a grammar:\n`\\?', `*', `+', `&', `!', `function', `alt', `seq' and nil.",
+ "arglist": [
+ "string",
+ "symbol",
+ "grammar",
+ "&optional",
+ "greedy",
+ "syntax"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-insert-at-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeation recording function for commands that insert text in region.\nFor example `mouse-yank-primary'. This records text insertion when a command\ninserts some text in a buffer between (point) and (mark).",
+ "arglist": [
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-expand-region": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Expand the region to the Visual selection.\nIf EXCLUDE-NEWLINE is non-nil and the selection ends with a newline,\nexclude that newline from the region.",
+ "arglist": [
+ "&optional",
+ "exclude-newline"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-pre-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Prepare the current command for recording the repeation.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-make-overriding-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Give KEYMAP precedence over the global keymap of STATE.\nThe keymap will have lower precedence than custom STATE bindings.\nIf STATE is nil, give it precedence over all states.\nIf COPY is t, create a copy of KEYMAP and give that\nhigher precedence. See also `evil-make-intercept-map'.",
+ "arglist": [
+ "keymap",
+ "&optional",
+ "state",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-word-begin": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the beginning of the COUNT-th next word.\nIf BIGWORD is non-nil, move by WORDS.\n\nIf this command is called in operator-pending state it behaves\ndifferently. If point reaches the beginning of a word on a new\nline point is moved back to the end of the previous line.\n\nIf called after a change operator, i.e. cw or cW,\n`evil-want-change-word-to-end' is non-nil and point is on a word,\nthen both behave like ce or cE.\n\nIf point is at the end of the buffer and cannot be moved signal\n'end-of-buffer is raised.\n",
+ "arglist": [
+ "&optional",
+ "count",
+ "bigword"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-has-command-properties-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether Evil properties are defined for COMMAND.\nSee also `evil-has-command-property-p'.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-get-substitute-info": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns the substitution info of command line STRING.\nThis function returns a three-element list (PATTERN REPLACEMENT\nFLAGS) consisting of the substitution parts of STRING. PATTERN is\na ex-pattern (see `evil-ex-make-pattern') and REPLACEMENT in a\ncompiled replacement expression (see `evil-compile-replacement').\nThe information returned is the actual substitution information\nw.r.t. to special situations like empty patterns or repetition of\nprevious substitution commands. If IMPLICIT-R is non-nil, then\nthe flag 'r' is assumed, i.e. in the case of an empty pattern the\nlast search pattern is used. This will be used when called from\na :substitute command with arguments.",
+ "arglist": [
+ "string",
+ "&optional",
+ "implicit-r"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-entry-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when entering Replace state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-interactive-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evaluate the interactive string STRING.\nThe string may contain extended interactive syntax.\nThe return value is a cons cell (FORM . PROPERTIES),\nwhere FORM is a single list-expression to be passed to\na standard `interactive' statement, and PROPERTIES is a\nlist of command properties as passed to `evil-define-command'.",
+ "arglist": [
+ "string"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-declare-motion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Declare COMMAND to be a movement function.\nThis ensures that it behaves correctly in visual state.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-digraphs": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-update-highlights": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update the overlays of all active highlights.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--parse-delmarks": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Where TO-BE-PARSED can contain ranges in the form `x-y'.\nPARSED is a list of characters whose marks should be deleted.\nLike vim, on invalid input, preceeding valid input is still parsed.",
+ "arglist": [
+ "to-be-parsed",
+ "&optional",
+ "parsed"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-concat-keymap-alists": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Concatenate keymap association lists, removing duplicates.\nA keymap alist is a list of cons cells (VAR . MAP) where each keymap\nmay occur only once, but where the variables may be repeated\n(e.g., (VAR . MAP1) (VAR . MAP2) is allowed). The order matters,\nwith the highest priority keymaps being listed first.",
+ "arglist": [
+ "&rest",
+ "sequences"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ret-gen": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "count",
+ "indent?"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Starts a forward search.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Echo area message for Motion state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-state": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The Evil state being switched to.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-exit-visual-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Exit from Visual state to the previous state.\nIf LATER is non-nil, exit after the current command.",
+ "arglist": [
+ "&optional",
+ "later",
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-open-brace": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to [count] previous unmatched '{'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-suppress-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Full keymap disabling default bindings to `self-insert-command'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-define-cmd": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Binds the function FUNCTION to the command CMD.",
+ "arglist": [
+ "cmd",
+ "function"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-pending-intercept-maps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "An alist of pending intercept maps.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-char'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-open-paren": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to [count] previous unmatched '('.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-previous-line-func": {
+ "default": "(closure (dabbrev-case-distinction dabbrev-search-these-buffers-only t) (arg) (let ((hippie-expand-try-functions-list '(try-expand-line try-expand-line-all-buffers))) (hippie-expand arg)))",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Minibuffer completion function used by \\<evil-insert-state-map>\\[evil-complete-previous-line].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-insert-at-point-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "beg",
+ "end",
+ "_length"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-jump": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "idx",
+ "shift"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-set-overlays": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the list of active overlays of the highlight HL to OVERLAYS.",
+ "arglist": [
+ "hl",
+ "overlays"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-yank-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Saves whole lines into the kill-ring.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the type of OBJECT to TYPE.\nFor example, (evil-set-type 'next-line 'line)\nwill make `line' the type of the `next-line' command.",
+ "arglist": [
+ "object",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-entry-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when entering Normal state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-refresh-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Refresh the cursor for STATE in BUFFER.\nBUFFER defaults to the current buffer. If STATE is nil the\ncursor type is either `evil-force-cursor' or the current state.",
+ "arglist": [
+ "&optional",
+ "state",
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-savehist-sync": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Updates the printable value of window jumps for `savehist'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-up": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window and the cursor COUNT lines upwards.\nIf COUNT is not specified the function scrolls down\n`evil-scroll-count', which is the last used count.\nIf the scroll count is zero the command scrolls half the screen.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-enclose-ace-jump-for-motion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enclose ace-jump to make it suitable for motions.\nThis includes restricting `ace-jump-mode' to the current window\nin visual and operator state, deactivating visual updates, saving\nthe mark and entering `recursive-edit'.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-scroll-count": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Holds last used prefix for `evil-scroll-up'\nand `evil-scroll-down'.\nDetermines how many lines should be scrolled.\nDefault value is 0 - scroll half the screen.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-local-map": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Buffer-local keymap for Visual state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-flash-delay": {
+ "default": 2,
+ "local": null,
+ "default-type": "integer",
+ "var-docstring": "\\<evil-motion-state-map>\nTime in seconds to flash search matches after \\[evil-search-next] and \\[evil-search-previous].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-definition-semantic": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find definition for POSITION with semantic.",
+ "arglist": [
+ "_string",
+ "position"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-global-set-key": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Bind KEY to DEF in STATE.",
+ "arglist": [
+ "state",
+ "key",
+ "def"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-name": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the name of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-auto-balance-windows": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil window creation and deletion trigger rebalancing.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-yank-line-handler": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Inserts the current text linewise.",
+ "arglist": [
+ "text"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-stop": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Stop recording a repeat.\nUpdate `evil-repeat-ring' with the accumulated changes\nin `evil-repeat-info' and clear variables.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enter an Ex command.\nThe ex command line is initialized with the value of\nINITIAL-INPUT. If the command is called interactively the initial\ninput depends on the current state. If the current state is\nnormal state and no count argument is given then the initial\ninput is empty. If a prefix count is given the initial input is\n.,.+count. If the current state is visual state then the initial\ninput is the visual region '<,'> or `<,`>. If the value of the\nglobal variable `evil-ex-initial-input' is non-nil, its content\nis appended to the line.",
+ "arglist": [
+ "&optional",
+ "initial-input"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-digraphs-table": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Table of default digraphs.\nThis includes all digraphs defined in RFC 1345,\nas well as miscellaneous digraphs for multi-byte characters.\nSee also `evil-digraphs-table-user'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-range-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set RANGE's end to END.\nIf COPY is non-nil, return a copy of RANGE.",
+ "arglist": [
+ "range",
+ "end",
+ "&optional",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-symbol-1-below": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-symbol-1-below'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Specifications made by `evil-define-command'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-end-of-line-or-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the last character of the current screen\nline if `visual-line-mode' is active and\n`evil-respect-visual-line-mode' is non-nil. If COUNT is given,\nmove COUNT - 1 screen lines downward first.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-command-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return all Evil properties of COMMAND.\nSee also `evil-get-command-property'.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-command-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Replace all of COMMAND's properties with PROPERTIES.\nPROPERTIES should be a property list.\nThis erases all previous properties; to only add properties,\nuse `evil-set-command-property'.",
+ "arglist": [
+ "command",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-make-search-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Creates a PATTERN for search.\nThis function respects the values of `evil-ex-search-case'.",
+ "arglist": [
+ "regexp"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-select-inner-object": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return an inner text object range of COUNT objects.\nIf COUNT is positive, return objects following point; if COUNT is\nnegative, return objects preceding point. If one is unspecified,\nthe other is used with a negative argument. THING is a symbol\nunderstood by thing-at-point. BEG, END and TYPE specify the\ncurrent selection. If LINE is non-nil, the text object should be\nlinewise, otherwise it is character wise.",
+ "arglist": [
+ "thing",
+ "beg",
+ "end",
+ "type",
+ "&optional",
+ "count",
+ "line"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-loop": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Loop with countdown variable.\nEvaluate BODY with VAR counting down from COUNT to 0.\nCOUNT can be negative, in which case VAR counts up instead.\nThe return value is the value of VAR when the loop\nterminates, which is 0 if the loop completes successfully.\nRESULT specifies a variable for storing this value.\n\n(fn (VAR COUNT [RESULT]) BODY...)",
+ "arglist": [
+ "spec",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-default-state": {
+ "default": "normal",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The default Evil state.\nThis is the state a buffer starts in when it is not otherwise\nconfigured (see `evil-set-initial-state' and\n`evil-buffer-regexps'). The value may be one of `normal',\n`insert', `visual', `replace', `operator', `motion' and `emacs'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-next-minibuffer-func": {
+ "default": "minibuffer-complete",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Minibuffer completion function used by \\<evil-insert-state-map>\\[evil-complete-next].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-marker": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return MARKER's line number in the current buffer.\nSignal an error if MARKER is in a different buffer.",
+ "arglist": [
+ "marker"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-this-motion-count": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Current motion count.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-char-2": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-char-2'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jump-backward-swap": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to the previous position in jump list.\nThe current position is placed in the jump list.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-previous-func": {
+ "default": "(closure (dabbrev-case-distinction dabbrev-search-these-buffers-only t) (arg) (require 'dabbrev) (let ((dabbrev-search-these-buffers-only (if evil-complete-all-buffers nil (list (current-buffer)))) dabbrev-case-distinction) (dabbrev-expand arg)))",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Completion function used by \\<evil-insert-state-map>\\[evil-complete-previous].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-last-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the line number of the last line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--eval-expr": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Eval INPUT and return stringified result, if of a suitable type.\nIf INPUT starts with a number, +, -, or . use `calc-eval' instead.",
+ "arglist": [
+ "input"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-local-mode-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hook run after entering or leaving `evil-local-mode'.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-update-insert-state-bindings": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update bindings in `evil-insert-state-map'.\nIf no arguments are given add the bindings specified in\n`evil-insert-state-bindings'. If REMOVE is non nil, remove only\nthese bindings. Unless FORCE is non nil, this will not\noverwriting existing bindings, which means bindings will not be\nadded if one already exists for a key and only default bindings\nare removed.\n\nNote that <delete>, <escape> and `evil-toggle-key' are not\nincluded in `evil-insert-state-bindings' by default.",
+ "arglist": [
+ "&optional",
+ "_option-name",
+ "remove",
+ "force"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-word-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search forward for symbol under point.",
+ "arglist": [
+ "&optional",
+ "count",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-interactive-alist": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Association list of Evil-specific interactive codes.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define an Evil state STATE.\nDOC is a general description and shows up in all docstrings;\nthe first line of the string should be the full name of the state.\n\nBODY is executed each time the state is enabled or disabled.\n\nOptional keyword arguments:\n- `:tag' - the mode line indicator, e.g. \"<T>\".\n- `:message' - string shown in the echo area when the state is\n activated.\n- `:cursor' - default cursor specification.\n- `:enable' - list of other state keymaps to enable when in this\n state.\n- `:entry-hook' - list of functions to run when entering this state.\n- `:exit-hook' - list of functions to run when exiting this state.\n- `:suppress-keymap' - if non-nil, effectively disables bindings to\n `self-insert-command' by making `evil-suppress-map' the parent of\n the global state keymap.\n\nThe global keymap of this state will be `evil-test-state-map',\nthe local keymap will be `evil-test-state-local-map', and so on.\n\n(fn STATE DOC [[KEY VAL]...] BODY...)",
+ "arglist": [
+ "state",
+ "doc",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-operator-state-entry-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when entering Operator-Pending state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-exit-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when exiting Operator-Pending state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-max": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the maximal buffer position of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-signal-at-bob-or-eob": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Signals error if `point' is at boundaries.\nIf `point' is at bob and COUNT is negative this function signal\n'beginning-of-buffer. If `point' is at eob and COUNT is positive\nthis function singal 'end-of-buffer. This function should be used\nin motions. COUNT defaults to 1.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-previous-mark": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The position of mark before Visual state, a marker.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-modes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Modes that should come up in Replace state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-beginning-of-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the first character of the current screen line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-justify-lines": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Justifes all lines in a range.\nBEG and END specify the range of those lines to be\njustified. JUSTIFY is either 'left, 'right or 'center according\nto the justification type. POSITION is the maximal text width for\nright and center justification or the column at which the lines\nshould be left-aligned for left justification.",
+ "arglist": [
+ "beg",
+ "end",
+ "justify",
+ "position"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-intercept-esc": {
+ "default": "always",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether Evil should intercept the escape key.\nIn the terminal, escape and a meta key sequence both generate the\nsame event. In order to distingush these, Evil uses\n`input-decode-map'. It is not necessary to do this in a graphical\nEmacs session. However, if you prefer to use `C-[' as escape (which\nis identical to the terminal escape key code), this interception must\nalso happen in graphical Emacs sessions. Set this variable to\n`always', t (only in the terminal) or nil (never intercept).",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-info": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-motion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeation for motions. Motions are recorded by keystroke but only in insert state.",
+ "arglist": [
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-min": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the minimal buffer position of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--next-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to next lowercase mark.\nMove forward if FORWARDP is truthy or backward if falsey.\nLoop back to the top of buffer if the end is reached.",
+ "arglist": [
+ "forwardp"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-match": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Replace text match by last search with REPLACEMENT.\nIf REPLACEMENT is an expression it will be evaluated to compute\nthe replacement text, otherwise the function behaves as\n`replace-match'.",
+ "arglist": [
+ "replacement",
+ "&optional",
+ "fixedcase",
+ "string"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-find-char-reverse": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat the last find COUNT times in the opposite direction.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-init-shell-argument-completion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Prepares the current minibuffer for completion of shell commands.\nThis function must be called from the :runner function of some\nargument handler that requires shell completion.",
+ "arglist": [
+ "flag",
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-global": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil substitute patterns are global by default.\nUsually (if this variable is nil) a substitution works only on\nthe first match of a pattern in a line unless the 'g' flag is\ngiven, in which case the substitution happens on all matches in a\nline. If this option is non-nil, this behaviour is reversed: the\nsubstitution works on all matches unless the 'g' pattern is\nspecified, then is works only on the first match.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The current Evil state.\nTo change the state, use `evil-change-state'\nor call the state function (e.g., `evil-normal-state').",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The position of `point' when the ex command has been called.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-and-close": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Saves the current buffer and closes the window.",
+ "arglist": [
+ "file",
+ "&optional",
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-first-non-blank": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the first non-blank character of the current line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-line-number": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Print the last line number.",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search forward for user-entered text.\nSearches for regular expression if `evil-regexp-search' is t.\n\nBelow is the documentation string for `isearch-forward',\nwhich lists available keys:\n\nDo incremental search forward.\nWith a prefix argument, do an incremental regular expression search instead.\n\nAs you type characters, they add to the search string and are found.\nThe following non-printing keys are bound in ‘isearch-mode-map’.\n\nType DEL to cancel last input item from end of search string.\nType RET to exit, leaving point at location found.\nType LFD (C-j) to match end of line.\nType C-s to search again forward, C-r to search again backward.\nType M-s M-< to go to the first match, M-s M-> to go to the last match.\nType C-w to yank next word or character in buffer\n onto the end of the search string, and search for it.\nType C-M-d to delete character from end of search string.\nType C-M-y to yank char from buffer onto end of search string and search for it.\nType C-M-z to yank from point until the next instance of a\n specified character onto end of search string and search for it.\nType M-s C-e to yank rest of line onto end of search string and search for it.\nType C-y to yank the last string of killed text.\nType M-y to replace string just yanked into search prompt\n with string killed before it.\nType C-q to quote control character to search for it.\nType C-x 8 RET to add a character to search by Unicode name, with completion.\nC-g while searching or when search has failed cancels input back to what has\n been found successfully.\nC-g when search is successful aborts and moves point to starting point.\n\nIf you try to exit with the search string still empty, it invokes\n nonincremental search.\n\nType M-s c to toggle search case-sensitivity.\nType M-s i to toggle search in invisible text.\nType M-s r to toggle regular-expression mode.\nType M-s w to toggle word mode.\nType M-s _ to toggle symbol mode.\nType M-s ' to toggle character folding.\n\nType M-s SPC to toggle whitespace matching.\nIn incremental searches, a space or spaces normally matches any whitespace\ndefined by the variable ‘search-whitespace-regexp’; see also the variables\n‘isearch-lax-whitespace’ and ‘isearch-regexp-lax-whitespace’.\n\nType M-s e to edit the search string in the minibuffer.\n\nAlso supported is a search ring of the previous 16 search strings.\nType M-n to search for the next item in the search ring.\nType M-p to search for the previous item in the search ring.\nType C-M-i to complete the search string using the search ring.\n\nType M-% to run ‘query-replace’ with string to replace from last search string.\nType C-M-% to run ‘query-replace-regexp’ with the last search string.\nType M-s o to run ‘occur’ that shows the last search string.\nType M-s h r to run ‘highlight-regexp’ that highlights the last search string.\nType M-s h l to run ‘highlight-lines-matching-regexp’ that highlights lines\n matching the last search string.\n\nType C-h b to display all Isearch key bindings.\nType C-h k to display documentation of Isearch key.\nType C-h m to display documentation of Isearch mode.\n\nIf an input method is turned on in the current buffer, that input\nmethod is also active while you are typing characters to search.\nTo toggle the input method, type C-\\. It also toggles the input\nmethod in the current buffer.\n\nTo use a different input method for searching, type C-^,\nand specify an input method you want to use.\n\nTo activate a transient input method, type C-x \\.\n\nThe above keys, bound in ‘isearch-mode-map’, are often controlled by\n options; do M-x apropos on search-.* to find them.\nOther control and meta characters terminate the search\n and are then executed normally (depending on ‘search-exit-option’).\nLikewise for function keys and mouse button events.\n\nIf this function is called non-interactively with a nil NO-RECURSIVE-EDIT,\nit does not return to the calling function until the search is done.\nSee the function ‘isearch-mode’ for more information.\n\n(fn &optional REGEXP-P NO-RECURSIVE-EDIT)",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-wrap-ring-bell": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether to ring the bell when search wraps around the buffer.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-swap": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Swap the values of variables THIS and THAT.\nIf three or more arguments are given, the values are rotated.\nE.g., (evil-swap A B C) sets A to B, B to C, and C to A.",
+ "arglist": [
+ "this",
+ "that",
+ "&rest",
+ "vars"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-delete-backward-char-and-join": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete previous character and join lines.\nIf point is at the beginning of a line then the current line will\nbe joined with the previous line if and only if\n`evil-backspace-join-lines'.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-WORD-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the end of the COUNT-th previous WORD.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-search-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open a command line window for forward searches.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ace-jump-exit-recursive-edit": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Exit a recursive edit caused by an evil jump.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-deactivate-input-method": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Disable input method in all states.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-to-column": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point to column COLUMN in the current line.\nPlaces point at left of the tab character (at the right if DIR\nis non-nil) and returns point.",
+ "arglist": [
+ "column",
+ "&optional",
+ "dir",
+ "force"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-match-substitute-replacement": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return REPLACEMENT as it will be inserted by `evil-replace-match'.",
+ "arglist": [
+ "replacement",
+ "&optional",
+ "fixedcase",
+ "string"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-call-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute the given command COMMAND.",
+ "arglist": [
+ "range",
+ "command",
+ "argument"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-block-corner": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Block corner corresponding to POINT, with MARK in opposite corner.\nDepending on POINT and MARK, the return value is `upper-left',\n`upper-right', `lower-left' or `lower-right':\n\n upper-left +---+ upper-right\n | |\n lower-left +---+ lower-right\n\nOne-column or one-row blocks are ambiguous. In such cases,\nthe horizontal or vertical component of CORNER is used.\nCORNER defaults to `upper-left'.",
+ "arglist": [
+ "&optional",
+ "corner",
+ "point",
+ "mark"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-align-left": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Left-align lines in the region at WIDTH columns.\nThe default for width is the value of `fill-column'.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "width"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-join": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Join the selected lines with optional COUNT and BANG.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "count",
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-close-folds": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Close all folds.\nSee also `evil-open-folds'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-WORD": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner WORD.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-match": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select previous match.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mouse--drag-set-mark-and-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "start",
+ "click",
+ "click-count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-completion-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Completion keymap for Ex.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "exit-minibuffer": "RET",
+ "exit-minibuffer": "RET",
+ "next-history-element": "<next>",
+ "previous-history-element": "<prior>",
+ "next-complete-history-element": "C-n",
+ "previous-complete-history-element": "C-p",
+ "forward-word": "M-f",
+ "backward-word": "M-b",
+ "abort-recursive-edit": "C-g",
+ "backward-kill-word": "C-w",
+ "quoted-insert": "C-v",
+ "evil-delete-whole-line": "C-u",
+ "next-complete-history-element": "C-n",
+ "evil-paste-from-register": "C-r",
+ "previous-complete-history-element": "C-p",
+ "evil-ex-completion": "C-l",
+ "evil-insert-digraph": "C-k",
+ "abort-recursive-edit": "C-g",
+ "evil-ex-command-window": "C-f",
+ "evil-ex-completion": "C-l",
+ "abort-recursive-edit": "C-g",
+ "move-beginning-of-line": "C-b",
+ "evil-ex-completion": "C-l",
+ "evil-ex-completion": "C-l",
+ "evil-ex-completion": "C-l",
+ "evil-ex-completion": "C-l",
+ "evil-ex-delete-backward-char": "DEL"
+ }
+ },
+ "evil-define-key*": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create a STATE binding from KEY to DEF for KEYMAP.\nSTATE is one of normal, insert, visual, replace, operator,\nmotion, emacs, or a list of one or more of these. Omitting a\nstate by using nil corresponds to a standard Emacs binding using\n`define-key' The remaining arguments are like those of\n`define-key'. For example:\n\n (evil-define-key* 'normal foo-map \"a\" 'bar)\n\nThis creates a binding from \"a\" to bar in Normal state, which\nis active whenever foo-map is active. Using nil for the state,\nthe following are equivalent:\n\n (evil-define-key* nil foo-map \"a\" 'bar)\n\n (define-key foo-map \"a\" 'bar)\n\n It is possible to specify multiple states and/or bindings at\n once:\n\n (evil-define-key* '(normal visual) foo-map\n \"a\" 'bar\n \"b\" 'foo)\n\nKEYMAP may also be a quoted symbol. If the symbol is global, the\nglobal evil keymap corresponding to the state(s) is used, meaning\nthe following are equivalent:\n\n (evil-define-key* 'normal 'global \"a\" 'bar)\n\n (evil-global-set-key 'normal \"a\" 'bar)\n\nThe symbol local may also be used, which corresponds to using\n`evil-local-set-key'.\n\nThe use is nearly identical to `evil-define-key' with the\nexception that this is a function and not a macro (and so will\nnot be expanded when compiled which can have unintended\nconsequences). `evil-define-key*' also does not defer any\nbindings like `evil-define-key' does using `evil-delay'. This\nallows errors in the bindings to be caught immediately, and makes\nits behavior more predictable.",
+ "arglist": [
+ "state",
+ "keymap",
+ "key",
+ "def",
+ "&rest",
+ "bindings"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-entry-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when entering Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-record": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Add INFO to the end of `evil-repeat-info'.",
+ "arglist": [
+ "info"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-indent-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Indent the line.",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-concatenate-interactive-forms": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Concatenate interactive list expressions FORMS.\nReturns a single expression where successive expressions\nare joined, if possible.",
+ "arglist": [
+ "&rest",
+ "forms"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to the marker specified by CHAR.",
+ "arglist": [
+ "char",
+ "&optional",
+ "noerror"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-last-cmd": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-shift-left": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shift text from BEG to END to the left.\nThe text is shifted to the nearest multiple of `evil-shift-width'\n(the rounding can be disabled by setting `evil-shift-round').\nIf PRESERVE-EMPTY is non-nil, lines that contain only spaces are\nindented, too, otherwise they are ignored. Location of point\nis preserved relative to text when called from insert state.\nOtherwise, it is determined by `evil-start-of-line' and/or `evil-track-eol'.\nSee also `evil-shift-right'.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "count",
+ "preserve-empty"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-range-beginning": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Beginning of `evil-operator-range'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the Visual selection as a range.\nThis is a list (BEG END TYPE PROPERTIES...), where BEG is the\nbeginning of the selection, END is the end of the selection,\nTYPE is the selection's type, and PROPERTIES is a property list\nof miscellaneous selection attributes.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-definition-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find definition for STRING with evil-search.",
+ "arglist": [
+ "string",
+ "_position"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-sort": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The Ex sort command.\n[BEG,END]sort[!] [i][u]\nThe following additional options are supported:\n\n * i ignore case\n * u remove duplicate lines\n\nThe 'bang' argument means to sort in reverse order.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "options",
+ "reverse"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-change-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Record change information for current command.",
+ "arglist": [
+ "beg",
+ "end",
+ "length"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-flash-search-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Flash last search matches for duration of `evil-flash-delay'.\nIf ALL is non-nil, flash all matches. STRING is a message\nto display in the echo area.",
+ "arglist": [
+ "string",
+ "&optional",
+ "all"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-definition-xref": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find definition at POSITION with xref.",
+ "arglist": [
+ "_string",
+ "position"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-undo-pop": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Undo the last buffer change.\nRemoves the last undo information from `buffer-undo-list'.\nIf undo is disabled in the current buffer, use the information\nin `evil-temporary-undo' instead.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-history": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The history for the search command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-search-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open a command line window for backward searches.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-symbol-word-search": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "If nil then * and # search for words otherwise for symbols.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-transient-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Toggle Transient Mark mode.\nEnsure that the region is properly deactivated.\nEnable with positive ARG, disable with negative ARG.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to insert state at beginning of current line.\nPoint is placed at the first non-blank character on the current\nline. The insertion will be repeated COUNT times. If VCOUNT is\nnon nil it should be number > 0. The insertion will be repeated\nin the next VCOUNT - 1 lines below the current one.",
+ "arglist": [
+ "count",
+ "&optional",
+ "vcount"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-match-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the match-hook of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-list-view-mode-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for `evil-list-view-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-list-view-goto-entry": "<return>",
+ "evil-list-view-goto-entry": "<return>",
+ "evil-list-view-quit": "q"
+ }
+ },
+ "evil-paste-clear-minibuffer-first": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "`evil-paste-before' cannot have `delete-minibuffer-contents' called before\nit fetches certain registers becuase this would trigger various ex-updates,\nsometimes moving point, so `C-a' `C-w' etc. would miss their intended target.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-cursor-color": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the cursor color to COLOR.",
+ "arglist": [
+ "color"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-contract": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Contract BEG and END as TYPE with PROPERTIES.\nReturns a list (BEG END TYPE PROPERTIES ...), where the tail\nmay contain a property list.",
+ "arglist": [
+ "beg",
+ "end",
+ "type",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-change-whole-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change whole line.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-execute-normal-keys": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The keys used to invoke the current `evil-execute-in-normal-state'.\nCan be used to detect if we are currently in that quasi-state.\nWith current bindings, it will be \\<evil-insert-state-map>\\[evil-execute-in-normal-state]",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-update-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update the current search pattern.",
+ "arglist": [
+ "_beg",
+ "_end",
+ "_range"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-properties": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Property list of miscellaneous Visual properties.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-copy-from-above": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Copy characters from preceding non-blank line.\nThe copied text is inserted before point.\nARG is the number of lines to move backward.\nSee also \\<evil-insert-state-map>\\[evil-copy-from-below].",
+ "arglist": [
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-declare-abort-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Declare COMMAND to be nonrepeatable.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-update": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update Ex variables when the minibuffer changes.\nThis function is usually called from `after-change-functions'\nhook. If BEG is non-nil (which is the case when called from\n`after-change-functions'), then an error description is shown\nin case of incomplete or unknown commands.",
+ "arglist": [
+ "&optional",
+ "beg",
+ "end",
+ "len",
+ "string"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-in-comment-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Checks if POS is within a comment according to current syntax.\nIf POS is nil, (point) is used. The return value is the beginning\nposition of the comment.",
+ "arglist": [
+ "&optional",
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-vim-style-regexp": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil Vim-style backslash codes are supported in search patterns.\nSee `evil-transform-vim-style-regexp' for the supported backslash\ncodes. Note that this only affects the search command if\n`evil-search-module' is set to 'evil-search. The isearch module\nalways uses plain Emacs regular expressions.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-line-to-top": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls line number COUNT (or the cursor line) to the top of the window.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-paragraph": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the end of the COUNT-th next paragraph.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-local-map": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Buffer-local keymap for Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-word-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for the next occurrence of word under the cursor.",
+ "arglist": [
+ "&optional",
+ "count",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a mode-line tag for SELECTION.\nSELECTION is a kind of selection as defined by\n`evil-define-visual-selection', such as `char', `line'\nor `block'.",
+ "arglist": [
+ "&optional",
+ "selection"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-exit-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when exiting Visual state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replacement-magic": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "All magic characters in a replacement string",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-transform": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Apply TRANSFORM on BEG and END with PROPERTIES.\nReturns a list (BEG END TYPE PROPERTIES ...), where the tail\nmay contain a property list. If TRANSFORM is undefined,\nreturn positions unchanged.",
+ "arglist": [
+ "transform",
+ "beg",
+ "end",
+ "type",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute a motion and return the buffer positions.\nThe return value is a list (BEG END TYPE).",
+ "arglist": [
+ "motion",
+ "&optional",
+ "count",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-shift-left-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shift the current line COUNT times to the left.\nThe text is shifted to the nearest multiple of\n`evil-shift-width'. Like `evil-shift-left' but always works on\nthe current line.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-maybe-expand-abbrev": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-count": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The explicit count when repeating a command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-overriding-keymap-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the state for the overriding keymap MAP.\nA return value of t means all states.",
+ "arglist": [
+ "map"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-range-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Type of `evil-operator-range'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-join": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Join the selected lines.",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the current state is Insert state.\n(That is, whether `evil-state' is `insert'.)",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-cjk": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-eval-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for eval input.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "exit-minibuffer": "RET",
+ "exit-minibuffer": "RET",
+ "next-history-element": "<next>",
+ "previous-history-element": "<prior>",
+ "next-complete-history-element": "C-n",
+ "previous-complete-history-element": "C-p",
+ "forward-word": "M-f",
+ "backward-word": "M-b",
+ "abort-recursive-edit": "C-g",
+ "backward-kill-word": "C-w",
+ "quoted-insert": "C-v",
+ "evil-delete-whole-line": "C-u",
+ "next-complete-history-element": "C-n",
+ "evil-paste-from-register": "C-r",
+ "previous-complete-history-element": "C-p",
+ "evil-insert-digraph": "C-k",
+ "abort-recursive-edit": "C-g",
+ "abort-recursive-edit": "C-g",
+ "move-beginning-of-line": "C-b"
+ }
+ },
+ "evil-with-active-region": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY with an active region from BEG to END.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-signal-without-movement": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Catches errors provided point moves within this scope.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-a-symbol": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a symbol.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-isearch-function": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a search function for use with isearch.\nBased on `isearch-regexp' and `isearch-forward'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-extract-count": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Splits the key-sequence KEYS into prefix-argument and the rest.\nReturns the list (PREFIX CMD SEQ REST), where PREFIX is the\nprefix count, CMD the command to be executed, SEQ the subsequence\ncalling CMD, and REST is all remaining events in the\nkey-sequence. PREFIX and REST may be nil if they do not exist.\nIf a command is bound to some keyboard macro, it is expanded\nrecursively.",
+ "arglist": [
+ "keys"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-member-recursive-if": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find the first item satisfying PREDICATE in TREE.",
+ "arglist": [
+ "predicate",
+ "tree"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-active-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the highlight with a certain NAME is active.",
+ "arglist": [
+ "name"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-beginning": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The beginning of the Visual selection, a marker.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-tree": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The syntax tree.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-binding": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns the final binding of COMMAND.",
+ "arglist": [
+ "command",
+ "&optional",
+ "noerror"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Mode line tag for Replace state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jump-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Replace state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-normal-state": "<escape>",
+ "evil-replace-backspace": "DEL",
+ "mouse-yank-primary": "<mouse-2>",
+ "evil-delete-backward-word": "C-w",
+ "evil-delete-backward-char-and-join": "",
+ "evil-paste-last-insertion-and-stop-insert": "C-@",
+ "evil-paste-last-insertion": "C-a",
+ "evil-shift-left-line": "C-d",
+ "evil-shift-right-line": "C-t",
+ "evil-complete-previous-line": "C-x C-p",
+ "evil-complete-next-line": "C-x C-n",
+ "evil-complete-previous": "C-p",
+ "evil-complete-next": "C-n",
+ "evil-copy-from-below": "C-e",
+ "evil-copy-from-above": "C-y",
+ "evil-paste-from-register": "C-r",
+ "evil-execute-in-normal-state": "C-o",
+ "evil-insert-digraph": "C-k",
+ "evil-quoted-insert": "C-v",
+ "evil-quoted-insert": "C-v",
+ "evil-append": "<insert>"
+ }
+ },
+ "evil-change-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change the state to STATE.\nIf STATE is nil, disable all states.",
+ "arglist": [
+ "state",
+ "&optional",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-enclose-avy-for-motion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enclose avy to make it suitable for motions.\nBased on `evil-enclose-ace-jump-for-motion'.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-next-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to [count] next lowercase mark.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-compile-replacement": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Maybe convert a regexp replacement TO to Lisp.\nReturns a list suitable for `perform-replace' if necessary, the\noriginal string if not. Currently the following magic characters\nin replacements are supported: 0-9&#lLuUrnbt,\nThe magic character , (comma) start an Emacs-lisp expression.",
+ "arglist": [
+ "to"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-version": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The current version of Evil",
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-point": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The position of point in Visual state, a marker.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-get-max": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the maximal position of the highlight with name NAME.",
+ "arglist": [
+ "name"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inclusive-normalize": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform normalize transformation on inclusive from BEG to END with PROPERTIES.\n\nInclude the character under point.\nIf the end position is at the beginning of a line or the end of a\nline and `evil-want-visual-char-semi-exclusive', then:\n\n* If in visual state return `exclusive' (expanded).",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-intercept-keymap-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the state for the intercept keymap MAP.\nA return value of t means all states.",
+ "arglist": [
+ "map"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-exit-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when exiting Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-push-search-history": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Push STRING into the appropriate search history (determined by FORWARD).",
+ "arglist": [
+ "string",
+ "forward"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paste-pop-next": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Same as `evil-paste-pop' but with negative argument.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-send-leader": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Put symbol leader in `unread-command-events' to trigger any\n<leader> bindings.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether Ex is currently active.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-screen-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "*Linewise selection in `visual-line-mode'.",
+ "fn-docstring": "Linewise selection in `visual-line-mode'.",
+ "arglist": [
+ "&optional",
+ "mark",
+ "point",
+ "type",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-auxiliary-keymap": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Get the auxiliary keymap for MAP in STATE.\nIf CREATE is non-nil, create an auxiliary keymap\nif MAP does not have one. If CREATE and\nIGNORE-PARENT are non-nil then a new auxiliary\nkeymap is created even if the parent of MAP has\none already.",
+ "arglist": [
+ "map",
+ "state",
+ "&optional",
+ "create",
+ "ignore-parent"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-selection": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the value of an X Windows selection.\nThe argument TYPE (default `PRIMARY') says which selection,\nand the argument DATA-TYPE (default `STRING') says\nhow to convert the data.\n\nTYPE may be any symbol (but nil stands for `PRIMARY'). However,\nonly a few symbols are commonly used. They conventionally have\nall upper-case names. The most often used ones, in addition to\n`PRIMARY', are `SECONDARY' and `CLIPBOARD'.\n\nDATA-TYPE is usually `STRING', but can also be one of the symbols\nin `selection-converter-alist', which see. Window systems other\nthan X usually support only a small subset of these symbols, in\naddition to `STRING'; MS-Windows supports `TARGETS', which reports\nthe formats available in the clipboard if TYPE is `CLIPBOARD'.\n\n(fn &optional TYPE DATA-TYPE)",
+ "arglist": [
+ "&optional",
+ "arg1",
+ "arg2"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-restore": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restore previous selection.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-remove-command-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Remove PROPERTIES from COMMAND.\nPROPERTIES should be a list of properties (:PROP1 :PROP2 ...).\nIf PROPERTIES is the empty list, all properties are removed.",
+ "arglist": [
+ "command",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-sort": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Place the smallest value in MIN and the largest in MAX.\nIf three or more arguments are given, place the smallest\nvalue in the first argument and the largest in the last,\nsorting in between.",
+ "arglist": [
+ "min",
+ "max",
+ "&rest",
+ "vars"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-intercept-maps": {
+ "default": "((edebug-mode-map))",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Keymaps that should intercept Evil maps.\nEntries have the form (MAP-VAR . STATE), where MAP-VAR is\na keymap variable and STATE is the state whose bindings\nshould be intercepted. If STATE is nil, all states are\nintercepted.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-interactive-code": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define an interactive code.\nPROMPT, if given, is the remainder of the interactive string\nup to the next newline. Command properties may be specified\nvia KEY-VALUE pairs. BODY should evaluate to a list of values.\n\n(fn CODE (PROMPT) [[KEY VALUE]...] BODY...)",
+ "arglist": [
+ "code",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-ex-search-activate-highlight": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Activate highlighting of the search pattern set to PATTERN.\nThis function does nothing if `evil-ex-search-interactive' or\n`evil-ex-search-highlight-all' is nil. ",
+ "arglist": [
+ "pattern"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-range-beginning": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set RANGE's beginning to BEG.\nIf COPY is non-nil, return a copy of RANGE.",
+ "arglist": [
+ "range",
+ "beg",
+ "&optional",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-pattern-whole-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return t if and only if PATTERN should match all occurences of a line.\nOtherwise PATTERN matches only the first occurence.",
+ "arglist": [
+ "pattern"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-esc-delay": {
+ "default": 0.01,
+ "local": null,
+ "default-type": "float",
+ "var-docstring": "The time, in seconds, to wait for another key after escape.\nIf no further event arrives during this time, the event is\ntranslated to `ESC'. Otherwise, it is translated according to\n`input-decode-map'. This does not apply in Emacs state, and may\nalso be inhibited by setting `evil-inhibit-esc'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-read-digraph-char-with-overlay": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Read two chars, displaying the first in OVERLAY, replacing `?'.\nReturn the digraph from `evil-digraph', else return second char.",
+ "arglist": [
+ "overlay"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-match": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select next match.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-remove-yank-excluded-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Removes `yank-excluded-properties' from TEXT.",
+ "arglist": [
+ "text"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-keymap-for-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the keymap associated with MODE.\nReturn the keymap variable if VARIABLE is non-nil.\nSee also `evil-mode-for-keymap'.",
+ "arglist": [
+ "mode",
+ "&optional",
+ "variable"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-visual-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restores a character visual selection.\nIf the selection is in a single line, the restored visual\nselection covers the same number of characters. If the selection\ncovers several lines, the restored selection covers the same\nnumber of lines and the same number of characters in the last\nline as the original selection.",
+ "arglist": [
+ "nfwdlines",
+ "nfwdchars"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--show-marks-select-action": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "entry"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-backward-history": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "History of backward searches.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-with-hproject-point-on-window": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Project point after BODY to current window.\nIf point is on a position left or right of the current window\nthen it is moved to the left and right boundary of the window,\nrespectively. If `auto-hscroll-mode' is non-nil then the left and\nright positions are increased or decreased, respectively, by\n`horizontal-margin' so that no automatic scrolling occurs.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-command-window-mode-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for `evil-command-window-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-command-window-execute": "<insert-state> RET",
+ "evil-command-window-execute": "<insert-state> RET"
+ }
+ },
+ "evil-forward-WORD-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the end of the COUNT-th next WORD.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-line-expand": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform expand transformation on line from BEG to END with PROPERTIES.\n\nInclude whole lines.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-highlight-all": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If t all matches for the substitute pattern are highlighted.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-show-registers": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shows the contents of REGISTERS, or all registers, if none supplied.",
+ "arglist": [
+ "registers"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-without-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-scroll-right": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window COUNT half-screenwidths to the right.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-vnew": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Splits the current window vertically\nand opens a new buffer name or edits a certain FILE.",
+ "arglist": [
+ "count",
+ "file"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-cross-buffers": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "When non-nil, the jump commands can cross borders between buffers, otherwise the jump commands act only within the current buffer.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Mode line tag for Motion state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Motion state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-avy-goto-word-or-subword-1": "",
+ "evil-avy-goto-word-1-below": "",
+ "evil-avy-goto-word-1-above": "",
+ "evil-avy-goto-word-1": "",
+ "evil-avy-goto-word-0": "",
+ "evil-avy-goto-symbol-1-below": "",
+ "evil-avy-goto-symbol-1-above": "",
+ "evil-avy-goto-symbol-1": "",
+ "evil-avy-goto-subword-1": "",
+ "evil-avy-goto-subword-0": "",
+ "evil-avy-goto-line-below": "",
+ "evil-avy-goto-line-above": "",
+ "evil-avy-goto-line": "",
+ "evil-avy-goto-char-timer": "",
+ "evil-avy-goto-char-in-line": "",
+ "evil-avy-goto-char-2-below": "",
+ "evil-avy-goto-char-2-above": "",
+ "evil-avy-goto-char-2": "",
+ "evil-avy-goto-char": "",
+ "evil-ace-jump-word-mode": "",
+ "evil-ace-jump-line-mode": "",
+ "evil-ace-jump-char-mode": "",
+ "evil-shell-command": "!",
+ "evil-ex": ":",
+ "evil-mouse-drag-region": "<down-mouse-1>",
+ "evil-scroll-down": "C-d",
+ "evil-jump-forward": "TAB",
+ "evil-emacs-state": "C-z",
+ "evil-next-line": "j",
+ "evil-previous-line": "k",
+ "evil-forward-char": "SPC",
+ "evil-backward-char": "h",
+ "evil-buffer": "C-^",
+ "evil-visual-block": "C-v",
+ "evil-visual-line": "V",
+ "evil-visual-char": "v",
+ "evil-scroll-left": "z H",
+ "evil-scroll-right": "z L",
+ "evil-scroll-column-left": "z h",
+ "evil-scroll-column-right": "z l",
+ "evil-scroll-line-to-bottom": "z b",
+ "evil-scroll-line-to-center": "z z",
+ "evil-scroll-line-to-top": "z t",
+ "evil-scroll-bottom-line-to-top": "z +",
+ "evil-scroll-top-line-to-bottom": "z ^",
+ "evil-execute-in-emacs-state": "\\",
+ "evil-ret": "RET",
+ "evil-scroll-line-up": "C-y",
+ "evil-jump-backward": "C-o",
+ "evil-scroll-page-down": "C-f",
+ "evil-scroll-line-down": "C-e",
+ "evil-scroll-page-up": "C-b",
+ "evil-jump-to-tag": "C-]",
+ "evil-switch-to-windows-last-buffer": "C-6",
+ "evil-window-map": "C-w",
+ "evil-previous-line-first-non-blank": "-",
+ "evil-next-line-1-first-non-blank": "_",
+ "evil-next-line-first-non-blank": "+",
+ "evil-first-non-blank": "^",
+ "evil-goto-column": "|",
+ "evil-search-backward": "?",
+ "evil-repeat-find-char": ";",
+ "evil-search-forward": "/",
+ "evil-repeat-find-char-reverse": ",",
+ "evil-search-word-forward": "*",
+ "evil-prev-flyspell-error": "[ s",
+ "evil-previous-mark": "[ `",
+ "evil-previous-mark-line": "[ '",
+ "evil-previous-open-brace": "[ {",
+ "evil-previous-open-paren": "[ (",
+ "evil-backward-section-end": "[ ]",
+ "evil-backward-section-begin": "[ [",
+ "evil-next-flyspell-error": "] s",
+ "evil-next-mark": "] `",
+ "evil-next-mark-line": "] '",
+ "evil-next-close-brace": "] }",
+ "evil-next-close-paren": "] )",
+ "evil-forward-section-end": "] [",
+ "evil-forward-section-begin": "] ]",
+ "evil-forward-sentence-begin": ")",
+ "evil-backward-sentence-begin": "(",
+ "evil-goto-mark-line": "'",
+ "evil-goto-mark": "`",
+ "evil-jump-item": "%",
+ "evil-beginning-of-line": "0",
+ "evil-end-of-line": "$",
+ "evil-end-of-line": "$",
+ "evil-search-word-backward": "#",
+ "evil-forward-paragraph": "}",
+ "evil-backward-paragraph": "{",
+ "evil-previous-match": "g N",
+ "evil-next-match": "g n",
+ "evil-visual-restore": "g v",
+ "evil-search-unbounded-word-forward": "g *",
+ "evil-search-unbounded-word-backward": "g #",
+ "evil-jump-to-tag": "C-]",
+ "evil-end-of-visual-line": "g $",
+ "evil-end-of-visual-line": "g $",
+ "evil-goto-char": "g o",
+ "evil-percentage-of-line": "g M",
+ "evil-middle-of-visual-line": "g m",
+ "evil-first-non-blank-of-visual-line": "g ^",
+ "evil-first-non-blank-of-visual-line": "g ^",
+ "evil-last-non-blank": "g _",
+ "evil-beginning-of-visual-line": "g 0",
+ "evil-previous-visual-line": "g k",
+ "evil-previous-visual-line": "g k",
+ "evil-next-visual-line": "g j",
+ "evil-next-visual-line": "g j",
+ "evil-goto-first-line": "g g",
+ "evil-backward-WORD-end": "g E",
+ "evil-backward-word-end": "g e",
+ "evil-goto-definition": "g d",
+ "evil-yank-line": "Y",
+ "evil-yank": "y",
+ "evil-forward-WORD-begin": "W",
+ "evil-forward-word-begin": "w",
+ "evil-find-char-to-backward": "T",
+ "evil-find-char-to": "t",
+ "evil-search-previous": "N",
+ "evil-search-next": "n",
+ "evil-window-middle": "M",
+ "evil-window-bottom": "L",
+ "evil-lookup": "K",
+ "evil-forward-char": "SPC",
+ "evil-forward-char": "SPC",
+ "evil-previous-line": "k",
+ "evil-next-line": "j",
+ "evil-window-top": "H",
+ "evil-backward-char": "h",
+ "evil-goto-line": "G",
+ "evil-find-char-backward": "F",
+ "evil-find-char": "f",
+ "evil-forward-WORD-end": "E",
+ "evil-forward-word-end": "e",
+ "evil-backward-WORD-begin": "B",
+ "evil-backward-word-begin": "b",
+ "digit-argument": "9",
+ "digit-argument": "9",
+ "digit-argument": "9",
+ "digit-argument": "9",
+ "digit-argument": "9",
+ "digit-argument": "9",
+ "digit-argument": "9",
+ "digit-argument": "9",
+ "digit-argument": "9",
+ "evil-beginning-of-line": "0"
+ }
+ },
+ "evil-initialize-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set up the initial state for BUFFER.\nBUFFER defaults to the current buffer.\nUses STATE if specified, or calls `evil-initial-state-for-buffer'.\nSee also `evil-set-initial-state'.",
+ "arglist": [
+ "&optional",
+ "state",
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-chars": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point to the end or beginning of a sequence of CHARS.\nCHARS is a character set as inside [...] in a regular expression.",
+ "arglist": [
+ "chars",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--get-block-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the exclusive range of a visual selection.\nOP and CL are pairs of buffer positions for the opening and\nclosing delimiter of a range. SELECTION-TYPE is the desired type\nof selection. It is a symbol that determines which parts of the\nblock are selected. If it is 'inclusive or t the returned range\nis (cons (car OP) (cdr CL)). If it is 'exclusive or nil the\nreturned range is (cons (cdr OP) (car CL)). If it is\n'exclusive-line the returned range will skip whitespace at the\nend of the line of OP and at the beginning of the line of CL.",
+ "arglist": [
+ "op",
+ "cl",
+ "selection-type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-argument-handler": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The argument handler for the current Ex command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-exit-emacs-state": "C-z"
+ }
+ },
+ "evil-avy-goto-char-2-above": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-char-2-above'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state-property": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the value of property PROP for STATE.\nPROP is a keyword as used by `evil-define-state'.\nSTATE is the state's symbolic name.\nIf VALUE is non-nil and the value is a variable,\nreturn the value of that variable.",
+ "arglist": [
+ "state",
+ "prop",
+ "&optional",
+ "value"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-pre-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Run before each COMMAND in Visual state.\nExpand the region to the selection unless COMMAND is a motion.",
+ "arglist": [
+ "&optional",
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The current Ex command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-max": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to the largest position in POSITIONS.\nNon-numerical elements are ignored.\nSee also `evil-goto-min'.",
+ "arglist": [
+ "&rest",
+ "positions"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-put-property": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set PROP to VAL for KEY in ALIST-VAR.\nALIST-VAR points to an association list with entries of the form\n(KEY . PLIST), where PLIST is a property list storing PROP and VAL.",
+ "arglist": [
+ "alist-var",
+ "key",
+ "prop",
+ "val",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-show-marks": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shows all marks.\nIf MRKS is non-nil it should be a string and only registers\ncorresponding to the characters of this string are shown.",
+ "arglist": [
+ "mrks"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-keybinding": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether to load evil-keybindings.el.\n\nThis loads a set of keybindings for evil in other modes as well as\nsetting the initial evil state in those modes.\n\nThis variable must be set before evil is loaded.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ace-jump-line-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Jump visually to the beginning of a line using ace-jump.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-yanked-rectangle": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Special function to delete the block yanked by a previous paste command.\nSupplied as the `undo' element of a yank handler.",
+ "arglist": [
+ "nrows",
+ "ncols"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--flyspell-overlay-after": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "pos",
+ "limit",
+ "forwardp"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-revert-reveal": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Unconditionally close overlays in OPEN-SPOTS in current window.\nModified version of `reveal-close-old-overlays' from\nreveal.el. OPEN-SPOTS is a local version of `reveal-open-spots'.",
+ "arglist": [
+ "open-spots"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-header-line-height": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the height of the header line.\nIf there is no header line, return 0.\nUsed as a fallback implementation of `window-header-line-height' on\nolder Emacsen.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-persistent-highlight": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil matches remain highlighted when the search ends.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-shift-round": {
+ "default": "t",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-normal-state-map>\nWhether shifting rounds to the nearest multiple.\nIf non-nil, \\[evil-shift-right] and \\[evil-shift-left] adjust line\nindentation to the nearest multiple of `evil-shift-width'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-apply-on-rectangle": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Like `apply-on-rectangle' but maybe extends to eol.\nIf `temporary-goal-column' is set to a big number, then the\nregion of each line is extended to the end of each line. The end\ncolumn is set to the maximal column in all covered lines.",
+ "arglist": [
+ "function",
+ "start",
+ "end",
+ "&rest",
+ "args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-min": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to the smallest position in POSITIONS.\nNon-numerical elements are ignored.\nSee also `evil-goto-max'.",
+ "arglist": [
+ "&rest",
+ "positions"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-bigword": {
+ "default": "^ \t\r\n",
+ "local": true,
+ "default-type": "string",
+ "var-docstring": "The set of characters to be interpreted as WORD boundaries.\nThis is enclosed with square brackets and used as a regular\nexpression. By default, whitespace characters are considered\nWORD boundaries.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-history": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "History of `evil-mode' jumps that are persisted with `savehist'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-open-fold": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open fold at point.\nSee also `evil-close-fold'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-start-undo-step": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Start a undo step.\nAll following buffer modifications are grouped together as a\nsingle action. If CONTINUE is non-nil, preceding modifications\nare included. The step is terminated with `evil-end-undo-step'.",
+ "arglist": [
+ "&optional",
+ "continue"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-current-insertion": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Information about the latest insertion in insert state.\nThis should be a pair (BEG . END) that describes the\nbuffer-region of the newly inserted text.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner tag block.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restores a character visual selection.\nIf the selection is in a single line, the restored visual\nselection covers the same number of characters. If the selection\ncovers several lines, the restored selection covers the same\nnumber of lines and the same number of characters in the last\nline as the original selection.",
+ "arglist": [
+ "nfwdlines"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-regexp-magic": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mouse-word": {
+ "default": "evil-word",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The thing-at-point symbol for double click selection.\nThe double-click starts visual state in a special word selection\nmode. This symbol is used to determine the words to be\nselected. Possible values are `evil-word' or `evil-WORD'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-eval": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "format",
+ "&rest",
+ "args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-open-above": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Insert a new line above point and switch to Insert state.\nThe insertion will be repeated COUNT times.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-mark-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to [count] line of previous lowercase mark before current line.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-exit-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when exiting Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-put-command-property": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set PROPERTY to VALUE for COMMAND.\nTo set multiple properties at once, see\n`evil-set-command-properties' and `evil-add-command-properties'.",
+ "arglist": [
+ "command",
+ "property",
+ "value"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-esc": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Translate \\e to 'escape if no further event arrives.\nThis function is used to translate a \\e event either to 'escape\nor to the standard ESC prefix translation map. If \\e arrives,\nthis function waits for `evil-esc-delay' seconds for another\nevent. If no other event arrives, the event is translated to\n'escape, otherwise it is translated to the standard ESC prefix\nmap stored in `input-decode-map'. If `evil-inhibit-esc' is\nnon-nil or if evil is in emacs state, the event is always\ntranslated to the ESC prefix.\n\nThe translation to 'escape happens only if the current command\nhas indeed been triggered by \\e. In other words, this will only\nhappen when the keymap is accessed from `read-key-sequence'. In\nparticular, if it is access from `define-key' the returned\nmapping will always be the ESC prefix map.",
+ "arglist": [
+ "map"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-mode-syntax-table": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Syntax table for `evil-command-window-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-up-block": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point to the end or beginning of text enclosed by BEG and END.\nBEG and END should be regular expressions matching the opening\nand closing delimiters, respectively. If COUNT is greater than\nzero point is moved forward otherwise it is moved\nbackwards. Whenever an opening delimiter is found the COUNT is\nincreased by one, if a closing delimiter is found the COUNT is\ndecreased by one. The motion stops when COUNT reaches zero. The\nmatch-data reflects the last successful match (that caused COUNT\nto reach zero). The behaviour of this functions is similar to\n`up-list'.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-register-list": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns an alist of all registers, but only those named\nwith number or character. Registers with symbol or string in names are ignored\nto keep Vim compatibility with register jumps.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-increase-width": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Increase current window width by COUNT.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-update-highlights-resize": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update highlights after resizing a window.",
+ "arglist": [
+ "frame"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save the current mark, including whether it is transient.\nSee also `evil-restore-mark'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-C-u-delete": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `C-u' deletes back to indentation in insert state.\nOtherwise, `C-u' applies a prefix argument. The binding of\n`C-u' mirrors Emacs behaviour by default due to the relative\nubiquity of prefix arguments.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT screen lines down.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-mode-abbrev-table": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Abbrev table for `evil-command-window-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-extract-append": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return an (APPEND . FILENAME) pair based on FILE-OR-APPEND.\nFILE-OR-APPEND should either be a filename or a \">> FILE\"\ndirective. APPEND will be t if FILE-OR-APPEND is an append\ndirective and nil otherwise. FILENAME will be the extracted\nfilename.",
+ "arglist": [
+ "file-or-append"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-exit": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Exit interactive search, keeping lazy highlighting active.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-minibuffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether to enable Evil in minibuffer(s).",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-undo-system": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Undo system Evil should use. If equal to `undo-tree' or\n`undo-fu', those packages must be installed. If equal to\n`undo-tree', `undo-tree-mode' must also be activated. If equal\nto `undo-redo', Evil uses commands natively available in Emacs 28.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-cached-header-line-height": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Cached height of the header line.\nUsed for fallback implementation on older Emacsen.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-upcase": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Convert text to upper case.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-define-argument-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Defines a new handler for argument-type ARG-TYPE.\nDOC is the documentation string. It is followed by a list of\nkeywords and function:\n\n:collection COLLECTION\n\n A collection for completion as required by `all-completions'.\n\n:completion-at-point FUNC\n\n Function to be called to initialize a potential\n completion. FUNC must match the requirements as described for\n the variable `completion-at-point-functions'. When FUNC is\n called the minibuffer content is narrowed to exactly match the\n argument.\n\n:runner FUNC\n\n Function to be called when the type of the current argument\n changes or when the content of this argument changes. This\n function should take one obligatory argument FLAG followed by\n an optional argument ARG. FLAG is one of three symbol 'start,\n 'stop or 'update. When the argument type is recognized for the\n first time and this handler is started the FLAG is 'start. If\n the argument type changes to something else or ex state\n finished the handler FLAG is 'stop. If the content of the\n argument has changed FLAG is 'update. If FLAG is either 'start\n or 'update then ARG is the current value of this argument. If\n FLAG is 'stop then arg is nil.",
+ "arglist": [
+ "arg-type",
+ "doc",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-change-commands": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Commands that wrap or replace `evil-change'.\nThis list exists to apply an inconsistency with vim's change command\nto commands that wrap or redefine it. See emacs-evil/evil#916.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-info": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Information accumulated during current repeat.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-all-buffers": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-insert-state-map>\nWhether completion looks for matches in all buffers.\nThis applies to \\[evil-complete-next] and \\[evil-complete-previous] in insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Cursor for Visual state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-select-xml-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a range (BEG END) of COUNT matching XML tags.\nIf INCLUSIVE is non-nil, the tags themselves are included\nfrom the range.",
+ "arglist": [
+ "beg",
+ "end",
+ "type",
+ "&optional",
+ "count",
+ "inclusive"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-symbol": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-0-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to insert state at beginning of current line.\nPoint is placed at column 0, or the beginning of the visual line.\nThe insertion will be repeated COUNT times. If VCOUNT is\nnon nil it should be number > 0. The insertion will be repeated\nin the next VCOUNT - 1 lines below the current one.",
+ "arglist": [
+ "count",
+ "&optional",
+ "vcount"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inhibit-esc": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil, the \\e event will never be translated to 'escape.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-sentence": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-C-g-bindings": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `C-g' postfix can be used in bindings.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a list (BEG END [TYPE] PROPERTIES...).\nBEG and END are buffer positions (numbers or markers),\nTYPE is a type as per `evil-type-p', and PROPERTIES is\na property list.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Cursor for Motion state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-vim-regexp-replacements": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-char-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Characterwise selection.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-yank-rectangle": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Saves the rectangle defined by region BEG and END into the kill-ring.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-vector-to-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Turns vector into a string, changing <escape> to '\\e'",
+ "arglist": [
+ "vector"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-copy-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a copy of RANGE.",
+ "arglist": [
+ "range"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-select-paren": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a range (BEG END) of COUNT delimited text objects.\nOPEN and CLOSE specify the opening and closing delimiter,\nrespectively. BEG END TYPE are the currently selected (visual)\nrange. If INCLUSIVE is non-nil, OPEN and CLOSE are included in\nthe range; otherwise they are excluded.\n\nThe types of OPEN and CLOSE specify which kind of THING is used\nfor parsing with `evil-select-block'. If OPEN and CLOSE are\ncharacters `evil-up-paren' is used. Otherwise OPEN and CLOSE\nmust be regular expressions and `evil-up-block' is used.\n\nIf the selection is exclusive, whitespace at the end or at the\nbeginning of the selection until the end-of-line or beginning-of-line\nis ignored.",
+ "arglist": [
+ "open",
+ "close",
+ "beg",
+ "end",
+ "type",
+ "count",
+ "&optional",
+ "inclusive"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-nearest": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Moves point forward to the first of several motions.\nFORWARDS is a list of forward motion functions (i.e. each moves\npoint forward to the next end of a text object (if passed a +1)\nor backward to the preceeding beginning of a text object (if\npassed a -1)). This function calls each of these functions once\nand moves point to the nearest of the resulting positions. If\nCOUNT is positive point is moved forward COUNT times, if negative\npoint is moved backward -COUNT times.",
+ "arglist": [
+ "count",
+ "&rest",
+ "forwards"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--execute-normal-return-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The state to return to after executing in normal state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-generate-mode-line-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Generate the evil mode-line tag for STATE.",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-quoted-insert": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Like `quoted-insert' but delete COUNT chars forward in replace state.\nAdds a `^' overlay as an input prompt.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-auto-indent": {
+ "default": "t",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-normal-state-map>\nWhether to auto-indent when opening lines with \\[evil-open-below] and \\[evil-open-above].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-update": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update the highlighting and info-message for the search pattern.\nPATTERN is the search pattern and OFFSET the associated offset.\nBEG and END specifiy the current match, MESSAGE is the info\nmessage to be shown. This function does nothing if\n`evil-ex-search-interactive' is nil.",
+ "arglist": [
+ "pattern",
+ "offset",
+ "beg",
+ "end",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-insert-commands": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Insert the commands in HIST.",
+ "arglist": [
+ "hist"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the current state is Emacs state.\n(That is, whether `evil-state' is `emacs'.)",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-jump": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set jump point at POS.\nPOS defaults to point.",
+ "arglist": [
+ "&optional",
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-overlay": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Overlay for highlighting the Visual selection.\nNot used for blockwise selections, in which case\nsee `evil-visual-block-overlays'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Mode line tag for Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-char-timer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-char-timer'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-concat-ranges": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Concatenate RANGES.\nRANGES must be a list of ranges. They must be ordered so that\nsuccessive ranges share their boundaries. The return value is a\nsingle range of disjoint union of the ranges or nil if the\ndisjoint union is not a single range.",
+ "arglist": [
+ "ranges"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "mouse-yank-primary": "<mouse-2>",
+ "evil-delete-backward-word": "C-w",
+ "evil-delete-backward-char-and-join": "DEL",
+ "evil-paste-last-insertion-and-stop-insert": "C-@",
+ "evil-paste-last-insertion": "C-a",
+ "evil-shift-left-line": "C-d",
+ "evil-shift-right-line": "C-t",
+ "evil-complete-previous-line": "C-x C-p",
+ "evil-complete-next-line": "C-x C-n",
+ "evil-complete-previous": "C-p",
+ "evil-complete-next": "C-n",
+ "evil-copy-from-below": "C-e",
+ "evil-copy-from-above": "C-y",
+ "evil-paste-from-register": "C-r",
+ "evil-execute-in-normal-state": "C-o",
+ "evil-insert-digraph": "C-k",
+ "evil-quoted-insert": "C-v",
+ "evil-quoted-insert": "C-v",
+ "evil-replace-state": "<insert>",
+ "evil-emacs-state": "C-z",
+ "evil-normal-state": "<escape>",
+ "delete-char": "<delete>"
+ }
+ },
+ "evil--ex-remove-echo-overlay": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Remove echo overlay from ex minibuffer.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-draw-prefix": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Display `evil-command-window-cmd-key' as a prefix to the current line.\nParameters passed in through IGNORED are ignored.",
+ "arglist": [
+ "&rest",
+ "ignored"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-history": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "History of Ex commands.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-list-view-mode-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hook run after entering Evil List View mode.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-end-of-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the end of the current line.\nIf COUNT is given, move COUNT - 1 lines downward first.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Mode line tag for Visual state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Visual state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-exit-visual-and-repeat": "<mouse-2>",
+ "evil-find-file-at-point-visual": "g f",
+ "evil-exit-visual-state": "<escape>",
+ "evil-inner-symbol": "i o",
+ "evil-inner-tag": "i t",
+ "evil-inner-back-quote": "i `",
+ "evil-inner-double-quote": "i \"",
+ "evil-inner-single-quote": "i '",
+ "evil-inner-angle": "i >",
+ "evil-inner-angle": "i >",
+ "evil-inner-curly": "i }",
+ "evil-inner-curly": "i }",
+ "evil-inner-curly": "i }",
+ "evil-inner-bracket": "i ]",
+ "evil-inner-bracket": "i ]",
+ "evil-inner-paren": "i )",
+ "evil-inner-paren": "i )",
+ "evil-inner-paren": "i )",
+ "evil-inner-paragraph": "i p",
+ "evil-inner-sentence": "i s",
+ "evil-inner-WORD": "i W",
+ "evil-inner-word": "i w",
+ "evil-a-symbol": "a o",
+ "evil-a-tag": "a t",
+ "evil-a-back-quote": "a `",
+ "evil-a-double-quote": "a \"",
+ "evil-a-single-quote": "a '",
+ "evil-an-angle": "a >",
+ "evil-an-angle": "a >",
+ "evil-a-curly": "a }",
+ "evil-a-curly": "a }",
+ "evil-a-curly": "a }",
+ "evil-a-bracket": "a ]",
+ "evil-a-bracket": "a ]",
+ "evil-a-paren": "a )",
+ "evil-a-paren": "a )",
+ "evil-a-paren": "a )",
+ "evil-a-paragraph": "a p",
+ "evil-a-sentence": "a s",
+ "evil-a-WORD": "a W",
+ "evil-a-word": "a w",
+ "ispell-word": "z =",
+ "evil-upcase": "U",
+ "evil-downcase": "u",
+ "evil-change-whole-line": "R",
+ "evil-visual-exchange-corners": "O",
+ "exchange-point-and-mark": "o",
+ "evil-insert": "I",
+ "evil-append": "A"
+ }
+ },
+ "evil-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "*Linewise selection.",
+ "fn-docstring": "Linewise selection.",
+ "arglist": [
+ "&optional",
+ "mark",
+ "point",
+ "type",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-in-single-undo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Set to non-nil if the current undo steps are connected.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-execute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute RESULT as an ex command on `evil-ex-current-buffer'.",
+ "arglist": [
+ "result"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-right": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to new COUNT-th window right of the current one.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-keymap": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap used in ex-search-mode.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "backward-kill-word": "C-w",
+ "quoted-insert": "C-v",
+ "evil-delete-whole-line": "C-u",
+ "previous-history-element": "C-p",
+ "next-history-element": "C-n",
+ "evil-paste-from-register": "C-r",
+ "evil-ex-search-command-window": "C-f",
+ "evil-insert-digraph": "C-k",
+ "abort-recursive-edit": "C-g",
+ "abort-recursive-edit": "C-g",
+ "move-beginning-of-line": "C-b",
+ "evil-ex-delete-backward-char": "DEL",
+ "abort-recursive-edit": "C-g",
+ "exit-minibuffer": "RET",
+ "exit-minibuffer": "RET",
+ "abort-minibuffers": "",
+ "file-cache-minibuffer-complete": "C-<tab>",
+ "self-insert-command": "TAB",
+ "previous-history-element": "C-p",
+ "previous-line-or-history-element": "<up>",
+ "previous-history-element": "C-p",
+ "next-history-element": "C-n",
+ "next-line-or-history-element": "<down>",
+ "next-history-element": "C-n",
+ "minibuffer-beginning-of-buffer": "M-<",
+ "previous-matching-history-element": "M-r",
+ "next-matching-history-element": "M-s",
+ "previous-history-element": "C-p",
+ "next-history-element": "C-n"
+ }
+ },
+ "evil-define-keymap": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define a keymap KEYMAP listed in `evil-mode-map-alist'.\nThat means it will have precedence over regular keymaps.\n\nDOC is the documentation for the variable. BODY, if specified,\nis executed after toggling the mode. Optional keyword arguments\nmay be specified before the body code:\n\n:mode VAR Mode variable. If unspecified, the variable\n is based on the keymap name.\n:local BOOLEAN Whether the keymap should be buffer-local, that is,\n reinitialized for each buffer.\n:func BOOLEAN Create a toggle function even if BODY is empty.\n\n(fn KEYMAP DOC [[KEY VAL]...] BODY...)",
+ "arglist": [
+ "keymap",
+ "doc",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-delete-marks": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "MARKS is a string denoting all marks to be deleted. Mark names are\neither single characters or a range of characters in the form `x-y'.\nIf FORCE is non-nil and MARKS is blank, all local marks except 0-9 are removed.",
+ "arglist": [
+ "marks",
+ "&optional",
+ "force"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-region-expanded": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Whether the region matches the Visual selection.\nThat is, whether the positions of point and mark have been\nexpanded to coincide with the selection's boundaries.\nThis makes the selection available to functions acting\non Emacs' region.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state-keymaps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a keymap alist of keymaps activated by STATE.\nIf STATE references other states in its :enable property,\nthese states are recursively processed and added to the list.\n(The EXCLUDED argument is an internal safeguard against\ninfinite recursion, keeping track of processed states.)",
+ "arglist": [
+ "state",
+ "&rest",
+ "excluded"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-completion-table": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-line-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Linewise selection.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-selection": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Make an X selection of type TYPE and value DATA.\nThe argument TYPE (nil means `PRIMARY') says which selection, and\nDATA specifies the contents. TYPE must be a symbol. (It can also\nbe a string, which stands for the symbol with that name, but this\nis considered obsolete.) DATA may be a string, a symbol, an\ninteger (or a cons of two integers or list of two integers).\n\nThe selection may also be a cons of two markers pointing to the same buffer,\nor an overlay. In these cases, the selection is considered to be the text\nbetween the markers *at whatever time the selection is examined*.\nThus, editing done in the buffer after you specify the selection\ncan alter the effective value of the selection.\n\nThe data may also be a vector of valid non-vector selection values.\n\nThe return value is DATA.\n\nInteractively, this command sets the primary selection. Without\nprefix argument, it reads the selection in the minibuffer. With\nprefix argument, it uses the text of the region as the selection value.\n\nNote that on MS-Windows, primary and secondary selections set by Emacs\nare not available to other programs.\n\n(fn TYPE DATA)",
+ "arglist": [
+ "arg1",
+ "arg2"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-buffer-new": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Creates a new buffer replacing the current window, optionally\n editing a certain FILE",
+ "arglist": [
+ "count",
+ "file"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-column": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restores the column after execution of BODY.\nSee also `evil-save-goal-column'.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-edit": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open FILE.\nIf no FILE is specified, reload the current buffer from disk.",
+ "arglist": [
+ "file",
+ "&optional",
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-cmd-key": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The key for the command that opened the command line window (:, /, or ?).",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-use-register": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Use REGISTER for the next command.",
+ "arglist": [
+ "register"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-eobp": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether point is at end-of-buffer with regard to end-of-line.",
+ "arglist": [
+ "&optional",
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paste-after": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Pastes the latest yanked text behind point.\nThe return value is the yanked text.",
+ "arglist": [
+ "count",
+ "&optional",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-select-search-module": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change the search module according to MODULE.\nIf MODULE is `isearch', then Emacs' isearch module is used.\nIf MODULE is `evil-search', then Evil's own interactive\nsearch module is used.",
+ "arglist": [
+ "option",
+ "module"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-start-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The point where the search started.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-WORD-begin": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the beginning of the COUNT-th next WORD.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-range-union": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the union of the ranges RANGE1 and RANGE2.\nIf the ranges have conflicting types, use RANGE1's type.\nThis can be overridden with TYPE.",
+ "arglist": [
+ "range1",
+ "range2",
+ "&optional",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-fill-and-move": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Fill text and move point to the end of the filled region.",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-lazy-highlight": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-block-expand": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform expand transformation on block from BEG to END with PROPERTIES.\n\nLike `inclusive', but for rectangles:\nthe last column is included.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-operator": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define an operator command OPERATOR.\nThe operator acts on the range of characters BEG through\nEND. BODY must execute the operator by potentially manipulating\nthe buffer contents, or otherwise causing side effects to happen.\n\nOptional keyword arguments are:\n- `:type' - force the input range to be of a given type (`inclusive',\n `line', `block', and `exclusive', or a self-defined motion type).\n- `:motion' - use a predetermined motion instead of waiting for one\n from the keyboard. This does not affect the behavior in visual\n state, where selection boundaries are always used.\n- `:repeat' - if non-nil (default), then \\<evil-normal-state-map>\\[evil-repeat] will repeat the\n operator.\n- `:move-point' - if non-nil (default), the cursor will be moved to\n the beginning of the range before the body executes\n- `:keep-visual' - if non-nil, the selection is not disabled when the\n operator is executed in visual state. By default, visual state is\n exited automatically.\n\n(fn OPERATOR (BEG END ARGS...) DOC [[KEY VALUE]...] BODY...)",
+ "arglist": [
+ "operator",
+ "args",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-ex-repeat-substitute-with-flags": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat last substitute command with last flags.\nThis is the same as :s//~/&",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "flags"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-join-whitespace": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Join the selected lines without changing whitespace.\n\\<evil-normal-state-map>Like \\[evil-join], but doesn't insert or remove any spaces.",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-goto-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to the last line of the Visual selection.\nThis position may differ from `evil-visual-end' depending on\nthe selection type, and is contained in the selection.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save the current state; execute BODY; restore the state.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-search-next": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat the last search.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-up-paren": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point to the end or beginning of balanced parentheses.\nOPEN and CLOSE should be characters identifying the opening and\nclosing parenthesis, respectively. If COUNT is greater than zero\npoint is moved forward otherwise it is moved backwards. Whenever\nan opening delimiter is found the COUNT is increased by one, if a\nclosing delimiter is found the COUNT is decreased by one. The\nmotion stops when COUNT reaches zero. The match-data reflects the\nlast successful match (that caused COUNT to reach zero).",
+ "arglist": [
+ "open",
+ "close",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-digraphs-table-user": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "List of user-defined digraphs.\nEntries have the form ((?CHAR1 ?CHAR2) . ?DIGRAPH). That is,\na cons cell of the digraph and its character replacement,\nwhere the digraph is a list of two characters.\nSee also `evil-digraphs-table'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-maps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Cursor for Insert state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-mark-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to [count] line of next lowercase mark after current line.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-force-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Overwrite the current states default cursor.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-screen-line-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Linewise selection in `visual-line-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-mark-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to the line of the marker specified by CHAR.",
+ "arglist": [
+ "char",
+ "&optional",
+ "noerror"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Echo area message for Visual state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-column": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the horizontal position of POS.\nPOS defaults to point.",
+ "arglist": [
+ "&optional",
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-clean-isearch-overlays": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Clean isearch overlays unless `this-command' is search.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-empty-ex-last-command": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether to default to evil-ex-previous-command at empty ex prompt.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-common": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-line-below": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-line-below'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the end of the COUNT next object.\nIf COUNT is negative, move to the COUNT previous object.\nFORWARD is a function which moves to the end of the object, and\nBACKWARD is a function which moves to the beginning.\nIf one is unspecified, the other is used with a negative argument.\nIf INCLUSIVE is non-nil, then point is placed at the last character\nof the object; otherwise it is placed at the end of the object.",
+ "arglist": [
+ "count",
+ "forward",
+ "&optional",
+ "backward",
+ "inclusive"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-open-below": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Insert a new line below point and switch to Insert state.\nThe insertion will be repeated COUNT times.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-start-track-last-insertion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Start tracking the last insertion.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-integration": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-WORD-begin": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the beginning of the COUNT-th previous WORD.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the current state is Motion state.\n(That is, whether `evil-state' is `motion'.)",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paragraph": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-type-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether SYM is the name of a type.",
+ "arglist": [
+ "sym"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-block-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Blockwise selection.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-off-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Replace state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-line-above": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-line-above'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-highlight-block": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Highlight rectangular region from BEG to END.\nDo this by putting an overlay on each line within the rectangle.\nEach overlay extends across all the columns of the rectangle.\nReuse overlays where possible to prevent flicker.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "overlays"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-command-property": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set PROPERTY to VALUE for COMMAND.\nTo set multiple properties at once, see\n`evil-set-command-properties' and `evil-add-command-properties'.",
+ "arglist": [
+ "command",
+ "property",
+ "value"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-copy-from-below": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Copy characters from following non-blank line.\nThe copied text is inserted before point.\nARG is the number of lines to move forward.\nSee also \\<evil-insert-state-map>\\[evil-copy-from-above].",
+ "arglist": [
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ac-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-avy-motion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "command",
+ "type"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil--jump-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-an-angle": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select an angle bracket.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-show-digraphs": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shows a list of all available digraphs.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-paragraph": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a paragraph.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-line-1-first-non-blank": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT-1 lines down on the first non-blank character.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-magic": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns a regexp matching the magic characters according to MAGIC.\nDepending on the value of MAGIC the following characters are\nconsidered magic.\n t [][{}*+?.&~$^\n nil [][{}*+?$^\n 'very-magic not 0-9A-Za-z_\n 'very-nomagic empty.",
+ "arglist": [
+ "magic"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-shell-command-completion-at-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-transform-regexp": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "regexp",
+ "replacements-alist"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Echo area message for Replace state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last search pattern.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Motion state is enabled.\nUse the command `evil-motion-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-side-windows": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Toggle side windows, evaluate BODY, restore side windows.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-last-find": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "A pair (FUNCTION . CHAR) describing the lastest character\n search command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-pre-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Remember the character under point.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-command-collection": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Called to complete a command.",
+ "arglist": [
+ "cmd",
+ "predicate",
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-buffers": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-left": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to new COUNT-th window left of the current one.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Mode line tag for Normal state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Normal state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "mouse-yank-primary": "<mouse-2>",
+ "evil-redo": "C-r",
+ "evil-undo": "u",
+ "evil-paste-pop": "C-p",
+ "evil-paste-pop": "C-p",
+ "evil-force-normal-state": "<escape>",
+ "evil-backward-char": "DEL",
+ "evil-quit": "Z Q",
+ "evil-save-modified-and-close": "Z Z",
+ "evil-shift-right": ">",
+ "evil-shift-left": "<",
+ "evil-indent": "=",
+ "evil-invert-char": "~",
+ "evil-use-register": "\"",
+ "evil-execute-macro": "@",
+ "evil-repeat": ".",
+ "evil-repeat-pop-next": "M-.",
+ "evil-repeat-pop": "C-.",
+ "pop-tag-mark": "C-t",
+ "evil-paste-pop": "C-p",
+ "evil-paste-pop-next": "C-n",
+ "ispell-word": "z =",
+ "evil-close-folds": "z m",
+ "evil-open-folds": "z r",
+ "evil-toggle-fold": "z a",
+ "evil-close-fold": "z c",
+ "evil-open-fold-rec": "z O",
+ "evil-open-fold": "z o",
+ "evil-find-file-at-point-with-line": "[ F",
+ "find-file-at-point": "[ f",
+ "evil-find-file-at-point-with-line": "[ F",
+ "find-file-at-point": "[ f",
+ "goto-last-change-reverse": "g ,",
+ "goto-last-change": "g ;",
+ "tab-bar-switch-to-prev-tab": "g T",
+ "tab-bar-switch-to-next-tab": "g t",
+ "evil-invert-case": "g ~",
+ "evil-rot13": "g ?",
+ "browse-url-at-point": "g x",
+ "evil-find-file-at-point-with-line": "[ F",
+ "find-file-at-point": "[ f",
+ "evil-upcase": "g U",
+ "evil-downcase": "g u",
+ "evil-fill": "g w",
+ "evil-fill-and-move": "g q",
+ "evil-join-whitespace": "g J",
+ "evil-insert-0-line": "g I",
+ "evil-insert-resume": "g i",
+ "what-cursor-position": "g a",
+ "what-cursor-position": "g a",
+ "evil-ex-repeat-global-substitute": "g &",
+ "evil-ex-repeat-substitute": "&",
+ "evil-yank-line": "Y",
+ "evil-yank": "y",
+ "evil-delete-char": "x",
+ "evil-delete-backward-char": "X",
+ "evil-delete-char": "x",
+ "evil-change-whole-line": "S",
+ "evil-substitute": "s",
+ "evil-replace-state": "R",
+ "evil-replace": "r",
+ "evil-record-macro": "q",
+ "evil-paste-before": "P",
+ "evil-paste-after": "p",
+ "evil-open-above": "O",
+ "evil-open-below": "o",
+ "evil-set-marker": "m",
+ "evil-join": "J",
+ "evil-insert-line": "I",
+ "evil-insert": "i",
+ "evil-insert": "i",
+ "evil-insert": "i",
+ "evil-delete-line": "D",
+ "evil-delete": "d",
+ "evil-change-line": "C",
+ "evil-change": "c",
+ "evil-append-line": "A",
+ "evil-append": "a"
+ }
+ },
+ "evil-complete-next-line-func": {
+ "default": "(closure (dabbrev-case-distinction dabbrev-search-these-buffers-only t) (arg) (let ((hippie-expand-try-functions-list '(try-expand-line try-expand-line-all-buffers))) (hippie-expand arg)))",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Minibuffer completion function used by \\<evil-insert-state-map>\\[evil-complete-next-line].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-post-jump-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run just after jumping to a location in the jump list.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether SYM is the name of a state.",
+ "arglist": [
+ "sym"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Echo area message for Operator-Pending state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-screen-line-expand": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform expand transformation on screen-line from BEG to END with PROPERTIES.\n\nInclude whole lines, being aware of `visual-line-mode'\nwhen `evil-respect-visual-line-mode' is non-nil.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-teardown": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Deinitialize Ex minibuffer.\nClean up everything set up by `evil-ex-setup'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-completion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Completes the current ex command or argument.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-select": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create a Visual selection of type TYPE from BEG to END.\nPoint and mark are positioned so that the resulting selection\nhas the specified boundaries. If DIR is negative, point precedes mark,\notherwise it succedes it. To specify point and mark directly,\nuse `evil-visual-make-selection'.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "dir",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-looking-at-start-comment": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns t if point is at the start of a comment.\npoint must be on one of the opening characters of a block comment\naccording to the current syntax table. Futhermore these\ncharacters must been parsed as opening characters, i.e. they\nwon't be considered as comment starters inside a string or\npossibly another comment. Point is moved to the first character\nof the comment opener if MOVE is non-nil.",
+ "arglist": [
+ "&optional",
+ "move"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-pattern-update-ex-info": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update the Ex info string.",
+ "arglist": [
+ "_hl",
+ "result"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-recording-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether we are recording a repeat.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-shift-right": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shift text from BEG to END to the right.\nThe text is shifted to the nearest multiple of `evil-shift-width'\n(the rounding can be disabled by setting `evil-shift-round').\nIf PRESERVE-EMPTY is non-nil, lines that contain only spaces are\nindented, too, otherwise they are ignored. Location of point\nis preserved relative to text when called from insert or replace states.\nOtherwise, it is determined by `evil-start-of-line' and/or `evil-track-eol'.\nSee also `evil-shift-left'.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "count",
+ "preserve-empty"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--show-jumps-select-action": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "jump"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-open-folds": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open all folds.\nSee also `evil-close-folds'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-shell-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last shell command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-downcase-first": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return STR with the first letter downcased.",
+ "arglist": [
+ "str"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-next-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Complete a whole line.\nCalls `evil-complete-next-line-func'.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-block-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Blockwise selection.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-alist": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Association list of Visual selection functions.\nElements have the form (NAME . FUNCTION).",
+ "fn-docstring": "Return an association list from types to selection symbols.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-local-map": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Buffer-local keymap for Operator-Pending state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-subword-0": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-subword-0'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-subword-1": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-subword-1'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motions": {
+ "default": "(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)",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Non-Evil commands to initialize to motions.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--lowercase-markers": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Get all lowercase markers.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-make-region": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create an active region from MARK to POINT.\nIf TYPE is given, also set the Visual type.\nIf MESSAGE is given, display it in the echo area.",
+ "arglist": [
+ "mark",
+ "point",
+ "&optional",
+ "type",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the current state is Replace state.\n(That is, whether `evil-state' is `replace'.)",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switches to another buffer.",
+ "arglist": [
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-clear-command-keys": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Clear `this-command-keys' and all information about the current command keys.\nCalling this function prevents further recording of the keys that\ninvoked the current command",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-down": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to new COUNT-th window below the current one.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-text-object-change-visual-type": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Text objects change the current visual state type.\nIf non-nil then a text-object changes the type of the visual state to\nits default selection type (e.g. a word object always changes to\ncharwise visual state). Otherwise the current visual state type is\npreserved.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-called-interactively-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Wrapper for `called-interactively-p'.\nIn older versions of Emacs, `called-interactively-p' takes\nno arguments. In Emacs 23.2 and newer, it takes one argument.",
+ "arglist": null,
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-percentage-of-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to COUNT % of the width of the current line.\nIf no COUNT is given, default to 50%.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-stop-track-last-insertion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Stop tracking the last insertion.\nThe tracked insertion is set to `evil-last-insertion'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-sentence": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a sentence.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-word": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner word.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-state": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The Evil state being switched from.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Replace state is enabled.\nUse the command `evil-replace-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-previous": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Complete to the nearest preceding word.\nSearch forward if a match isn't found.\nCalls `evil-complete-previous-func'.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move forward to end of THING.\nThe motion is repeated COUNT times.",
+ "arglist": [
+ "thing",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-exchange-corners": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Rearrange corners in Visual Block mode.\n\n M---+ +---M\n | | <=> | |\n +---P P---+\n\nFor example, if mark is in the upper left corner and point\nin the lower right, this function puts mark in the upper right\ncorner and point in the lower left.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-line-first-non-blank": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT lines up on the first non-blank character.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the current state is Normal state.\n(That is, whether `evil-state' is `normal'.)",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Echo area message for Normal state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-split-window-below": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil split windows are created below.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-types": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-argument-completion-at-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-up": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to new COUNT-th window above the current one.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-global-marker-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether CHAR denotes a global marker.",
+ "arglist": [
+ "char"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-this-operator": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Current operator.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-beginning": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move forward to beginning of THING.\nThe motion is repeated COUNT times.",
+ "arglist": [
+ "thing",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-range-motion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Motion of `evil-operator-range'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-register": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last executed register.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-word-1-below": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-word-1-below'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-set-max": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the minimal buffer position of the highlight HL to MAX.",
+ "arglist": [
+ "hl",
+ "max"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Visual state is enabled.\nUse the command `evil-visual-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--redo-placeholder": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "_count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-bracket": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner square bracket.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-rotate-downwards": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Rotates the windows according to the current cyclic ordering.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-set-height": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Sets the height of the current window to COUNT.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-execute-in-emacs-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute the next command in Emacs state.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-line-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return size of line from BEG to END with PROPERTIES.\n\nInclude whole lines.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-auxiliary-keymap-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether MAP is an auxiliary keymap.",
+ "arglist": [
+ "map"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-set-region": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set minimal and maximal position of highlight NAME to BEG and END.",
+ "arglist": [
+ "name",
+ "beg",
+ "end",
+ "&optional",
+ "_type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-echo-area-save": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save the current echo area in `evil-echo-area-message'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-local-map": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Buffer-local keymap for Replace state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-finish-record-changes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Finishes the recording of buffer changes and records them as repeat.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-find-next": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for the next occurrence of the PATTERN in DIRECTION.\nPATTERN must be created using `evil-ex-make-pattern', DIRECTION\nis either 'forward or 'backward. If NOWRAP is non nil, the search\ndoes not wrap at buffer boundaries. Furthermore this function\nonly searches invisible text if `search-invisible' is t. If\nPATTERN is not specified the current global pattern\n`evil-ex-search-pattern' and if DIRECTION is not specified the\ncurrent global direction `evil-ex-search-direction' is used.\nThis function returns t if the search was successful, nil if it\nwas unsuccessful and 'wrapped if the search was successful but\nhas been wrapped at the buffer boundaries.",
+ "arglist": [
+ "&optional",
+ "pattern",
+ "direction",
+ "nowrap"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-update-delay": {
+ "default": 0.02,
+ "local": null,
+ "default-type": "float",
+ "var-docstring": "Time in seconds of idle before updating search highlighting.\nSetting this to a period shorter than that of keyboard's repeat\nrate allows highlights to update while scrolling.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct-previous-pos": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Access slot \"previous-pos\" of `evil-jumps-struct' struct CL-X.",
+ "arglist": [
+ "cl-x"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-pattern-ignore-case": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return t if and only if PATTERN should ignore case.",
+ "arglist": [
+ "pattern"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-add-to-alist": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Add the assocation of KEY and VAL to the value of LIST-VAR.\nIf the list already contains an entry for KEY, update that entry;\notherwise add at the end of the list.",
+ "arglist": [
+ "list-var",
+ "key",
+ "val",
+ "&rest",
+ "elements"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-visual-block": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restores a character visual selection.\nIf the selection is in a single line, the restored visual\nselection covers the same number of characters. If the selection\ncovers several lines, the restored selection covers the same\nnumber of lines and the same number of characters in the last\nline as the original selection.",
+ "arglist": [
+ "nfwdlines",
+ "nfwdchars"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The current range of the Ex command.",
+ "fn-docstring": "Returns the first and last position of the current range.",
+ "arglist": [
+ "beg-line",
+ "&optional",
+ "end-line"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-bottom-right": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to bottom-right window.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Echo area message for Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-show-file-info": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shows basic file information.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-find-char-to-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move before the previous COUNT'th occurrence of CHAR.",
+ "arglist": [
+ "&optional",
+ "count",
+ "char"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-cmhh": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-jumping-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Set by `evil--jump-backward', used and cleared in the\n`post-command-hook' by `evil--jump-handle-buffer-crossing'",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-concat-alists": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Concatenate association lists, removing duplicates.\nAn alist is a list of cons cells (KEY . VALUE) where each key\nmay occur only once. Later values overwrite earlier values.",
+ "arglist": [
+ "&rest",
+ "sequences"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-append": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to Insert state just after point.\nThe insertion will be repeated COUNT times and repeated once for\nthe next VCOUNT - 1 lines starting at the same column. If\nSKIP-EMPTY-LINES is non-nil, the insertion will not be performed\non lines on which the insertion point would be after the end of\nthe lines.",
+ "arglist": [
+ "count",
+ "&optional",
+ "vcount",
+ "skip-empty-lines"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Visual state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-completed-binding": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns the final binding of the completion of COMMAND.",
+ "arglist": [
+ "command",
+ "&optional",
+ "noerror"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-get-window-jump-list": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-syntactic-context": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the syntactical context of the character at POS.\nPOS defaults to the current position of point.",
+ "arglist": [
+ "&optional",
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-initial-state-for-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the initial Evil state to use for BUFFER.\nBUFFER defaults to the current buffer. Returns DEFAULT\nif no initial state is associated with BUFFER.\nSee also `evil-initial-state'.",
+ "arglist": [
+ "&optional",
+ "buffer",
+ "default"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-update-timer": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Time used for updating highlights.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-sentence": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner sentence.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Cursor for Emacs state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-local-mode-set-explicitly": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-curly": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a curly bracket (\"brace\").",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-repeat-global-substitute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat last substitute command on the whole buffer.\nThis is the same as :%s//~/&",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jump-to-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Jump to tag under point.\nIf called with a prefix argument, provide a prompt\nfor specifying the tag.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-execute-repeat-info": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Executes a repeat-information REPEAT-INFO.",
+ "arglist": [
+ "repeat-info"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state-auxiliary-keymaps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a keymap alist of auxiliary keymaps for STATE.",
+ "arglist": [
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-signal-at-bob": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Signals 'beginning-of-buffer if `point' is at bob.\nThis function should be used in backward motions. If `point' is at\nbob so that no further backward motion is possible the error\n'beginning-of-buffer is raised.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-concat-plists": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Concatenate property lists, removing duplicates.\nA property list is a list (:KEYWORD1 VALUE1 :KEYWORD2 VALUE2...)\nwhere each keyword may occur only once. Later values overwrite\nearlier values.",
+ "arglist": [
+ "&rest",
+ "sequences"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-states": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-paren": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a parenthesis.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-section-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the end of the COUNT-th next section.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-force-abort-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns non-nil iff the current command should abort the recording of repeat information.",
+ "arglist": [
+ "repeat-type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-line-first-non-blank": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT lines down on the first non-blank character.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-reset": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Clear all repeat recording variables.\nSet `evil-recording-repeat' to FLAG.",
+ "arglist": [
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-record-macro": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Record a keyboard macro into REGISTER.\nIf REGISTER is :, /, or ?, the corresponding command line window\nwill be opened instead.",
+ "arglist": [
+ "register"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mouse-start-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a list of region bounds based on START and END according to MODE.\nIf MODE is not 1 then set point to (min START END), mark to (max\nSTART END). If MODE is 1 then set point to start of word at (min\nSTART END), mark to end of word at (max START END).",
+ "arglist": [
+ "start",
+ "end",
+ "mode"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-disable-insert-state-bindings": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether insert state bindings should be used.\nBindings for escape, delete and `evil-toggle-key' are always\navailable. If this is non-nil, default Emacs bindings are by and\nlarge accessible in insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-parser--dexp": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Parse a numerical dollar-sign symbol.\nGiven e.g. $4, return 4.",
+ "arglist": [
+ "obj"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-align-right": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Right-align lines in the region at WIDTH columns.\nThe default for width is the value of `fill-column'.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "width"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-resize-window": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the current window's width or height to NEW-SIZE.\nIf HORIZONTAL is non-nil the width of the window is changed,\notherwise its height is changed.",
+ "arglist": [
+ "new-size",
+ "&optional",
+ "horizontal"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--stick-to-eol-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Called by vertical movement commands to help determine cursor position.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-do-update-highlight": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Timer function for updating the highlights.",
+ "arglist": [
+ "&optional",
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the :repeat property of COMMAND.\nIf COMMAND doesn't have this property, return DEFAULT.",
+ "arglist": [
+ "command",
+ "&optional",
+ "default"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-write": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save the current buffer, from BEG to END, to FILE-OR-APPEND.\nIf FILE-OR-APPEND is of the form \">> FILE\", append to FILE\ninstead of overwriting. The current buffer's filename is not\nchanged unless it has no associated file and no region is\nspecified. If the file already exists and the BANG argument is\nnon-nil, it is overwritten without confirmation.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "file-or-append",
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-global-keymaps-alist": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Association list of keymap variables.\nEntries have the form (MODE . KEYMAP), where KEYMAP\nis the variable containing the keymap for MODE.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Motion state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-yank-characters": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Saves the characters defined by the region BEG and END in the kill-ring.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-deactivate-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Deactivate the region and restore Transient Mark mode.",
+ "arglist": [
+ "&optional",
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-screen-line-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Linewise selection in `visual-line-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-mark": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The position of mark in Visual state, a marker.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-minor-mode-keymap": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Get the auxiliary keymap for MODE in STATE, creating one if it\ndoes not already exist.",
+ "arglist": [
+ "state",
+ "mode"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-undo-function": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Function to be used by `evil-undo'.\nCustomized via `evil-undo-system'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-marker": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the marker denoted by CHAR.\nThis is either a marker object as returned by `make-marker',\na number, a cons cell (FILE . POS) with FILE being a string\nand POS a number, or nil. If RAW is non-nil, then the\nreturn value may also be a variable, a movement function,\nor a marker object pointing nowhere.",
+ "arglist": [
+ "char",
+ "&optional",
+ "raw"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-marker": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the marker denoted by CHAR to position POS.\nPOS defaults to the current position of point.\nIf ADVANCE is t, the marker advances when inserting text at it;\notherwise, it stays behind.",
+ "arglist": [
+ "char",
+ "&optional",
+ "pos",
+ "advance"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-window-jumps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hashtable which stores all jumps on a per window basis.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Operator-Pending state is enabled.\nUse the command `evil-operator-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paste-count": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The count argument of the current paste command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-grammar": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Grammar for Ex.\nAn association list of syntactic symbols and their definitions.\nThe first entry is the start symbol. A symbol's definition may\nreference other symbols, but the grammar cannot contain\nleft recursion. See `evil-parser' for a detailed explanation\nof the syntax.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-core": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-toggle-fold": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open or close a fold under point.\nSee also `evil-open-fold' and `evil-close-fold'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-backward-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete previous character.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-repeat-substitute-with-search-and-flags": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat last substitute command with last search pattern and last flags.\nThis is the same as :s//~/&r",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "flags"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define a command COMMAND.\n\n(fn COMMAND (ARGS...) DOC [[KEY VALUE]...] BODY...)",
+ "arglist": [
+ "command",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-backspace-join-lines": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether backward delete in insert state may join lines.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-goto-offset": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point according to search OFFSET and set `evil-this-type' accordingly.\nThis function assumes that the current match data represents the\ncurrent search result.",
+ "arglist": [
+ "offset"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-start-col": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Used to restore column (where possible) after an operator has moved it.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-execute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute the command under the cursor in the appropriate buffer.\nThe local var `evil-command-window-execute-fn' determines which\nfunction to execute.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-modes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Modes that should come up in Visual state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-type-property": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return property PROP for TYPE.",
+ "arglist": [
+ "type",
+ "prop"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-update-highlights-scroll": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update highlights after scrolling in some window.",
+ "arglist": [
+ "win",
+ "_beg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-replace-special-filenames": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Replace special symbols in FILE-NAME.\nReplaces % by the current file-name,\nReplaces # by the alternate file-name in FILE-NAME.",
+ "arglist": [
+ "file-name"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-match-interactive-code": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Match an interactive code at position POS in string INTERACTIVE.\nReturns the first matching entry in `evil-interactive-alist', or nil.",
+ "arglist": [
+ "interactive",
+ "&optional",
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-double-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner double-quoted expression.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-jumping": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-matches": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-types": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "An alist of defined repeat-types.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-intercept-keymap-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether MAP is an intercept keymap for STATE.\nIf STATE is nil, it means any state.",
+ "arglist": [
+ "map",
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normalize-repeat-info": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Concatenate consecutive arrays in REPEAT-INFO.\nReturns a single array.",
+ "arglist": [
+ "repeat-info"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-disabled-buffer-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether Evil should be disabled in BUFFER.",
+ "arglist": [
+ "&optional",
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-comment": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-text-object": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define a text object command OBJECT.\nBODY should return a range (BEG END) to the right of point\nif COUNT is positive, and to the left of it if negative.\n\nOptional keyword arguments:\n- `:type' - determines how the range applies after an operator\n (`inclusive', `line', `block', and `exclusive', or a self-defined\n motion type).\n- `:extend-selection' - if non-nil (default), the text object always\n enlarges the current selection. Otherwise, it replaces the current\n selection.\n\n(fn OBJECT (COUNT) DOC [[KEY VALUE]...] BODY...)",
+ "arglist": [
+ "object",
+ "args",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-interactive-replace": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If t and substitute patterns are highlighted,\nthe replacement is shown interactively.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-cursor-back": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether the cursor is moved backwards when exiting insert state.\nIf non-nil, the cursor moves \"backwards\" when exiting insert state,\nso that it ends up on the character to the left. Otherwise it remains\nin place, on the character to the right.",
+ "fn-docstring": "Move point one character back within the current line.\nContingent on the variable `evil-move-cursor-back' or the FORCE\nargument. Honors field boundaries, i.e., constrains the movement\nto the current field as recognized by `line-beginning-position'.",
+ "arglist": [
+ "&optional",
+ "force"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-fold-action": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform fold ACTION for each matching major or minor mode in LIST.\n\nACTION will be performed for the first matching handler in LIST. For more\ninformation on its features and format, see the documentation for\n`evil-fold-list'.\n\nIf no matching ACTION is found in LIST, an error will signaled.\n\nHandler errors will be demoted, so a problem in one handler will (hopefully)\nnot interfere with another.",
+ "arglist": [
+ "list",
+ "action"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete to end of line.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-post-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Finish recording of repeat-information for the current-command.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-rectangle-expand": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform expand transformation on rectangle from BEG to END with PROPERTIES.\n\nLike `exclusive', but for rectangles:\nthe last column is excluded.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-paste": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Information about the latest paste.\nThis should be a list (CMD COUNT POINT BEG END FIRSTVISUAL) where\nCMD is the last paste-command (`evil-paste-before',\n`evil-paste-after' or `evil-visual-paste'), COUNT is the repeat\ncount of the paste, POINT is the position of point before the\npaste, BEG end END are the region of the inserted\ntext. FIRSTVISUAL is t if and only if the previous command was\nthe first visual paste (i.e. before any paste-pop).",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Deletes a buffer.\nAll windows currently showing this buffer will be closed except\nfor the last window in each frame.",
+ "arglist": [
+ "buffer",
+ "&optional",
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-find-temp": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT screen lines up.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-flash-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Disable hightlighting if `this-command' is not search.\nDisable anyway if FORCE is t.",
+ "arglist": [
+ "&optional",
+ "force"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-window": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the window of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-parse": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Parse STRING as an Ex expression and return an evaluation tree.\nIf SYNTAX is non-nil, return a syntax tree instead.\nSTART is the start symbol, which defaults to `expression'.",
+ "arglist": [
+ "string",
+ "&optional",
+ "syntax",
+ "start"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-make-substitute-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Creates a PATTERN for substitution with FLAGS.\nThis function respects the values of `evil-ex-substitute-case'\nand `evil-ex-substitute-global'.",
+ "arglist": [
+ "regexp",
+ "flags"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-paren": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner parenthesis.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-outer-text-objects-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for outer text objects.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-a-symbol": "o",
+ "evil-a-tag": "t",
+ "evil-a-back-quote": "`",
+ "evil-a-double-quote": "\"",
+ "evil-a-single-quote": "'",
+ "evil-an-angle": ">",
+ "evil-an-angle": ">",
+ "evil-a-curly": "}",
+ "evil-a-curly": "}",
+ "evil-a-curly": "}",
+ "evil-a-bracket": "]",
+ "evil-a-bracket": "]",
+ "evil-a-paren": ")",
+ "evil-a-paren": ")",
+ "evil-a-paren": ")",
+ "evil-a-paragraph": "p",
+ "evil-a-sentence": "s",
+ "evil-a-WORD": "W",
+ "evil-a-word": "w"
+ }
+ },
+ "evil-ex-repeat-substitute-with-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat last substitute command with last search pattern.\nThis is the same as :s//~/r",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "flags"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-rotate-upwards": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Rotates the windows according to the current cyclic ordering.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search backward for user-entered text.\nSearches for regular expression if `evil-regexp-search' is t.\n\nBelow is the documentation string for `isearch-forward',\nwhich lists available keys:\n\nDo incremental search forward.\nWith a prefix argument, do an incremental regular expression search instead.\n\nAs you type characters, they add to the search string and are found.\nThe following non-printing keys are bound in ‘isearch-mode-map’.\n\nType DEL to cancel last input item from end of search string.\nType RET to exit, leaving point at location found.\nType LFD (C-j) to match end of line.\nType C-s to search again forward, C-r to search again backward.\nType M-s M-< to go to the first match, M-s M-> to go to the last match.\nType C-w to yank next word or character in buffer\n onto the end of the search string, and search for it.\nType C-M-d to delete character from end of search string.\nType C-M-y to yank char from buffer onto end of search string and search for it.\nType C-M-z to yank from point until the next instance of a\n specified character onto end of search string and search for it.\nType M-s C-e to yank rest of line onto end of search string and search for it.\nType C-y to yank the last string of killed text.\nType M-y to replace string just yanked into search prompt\n with string killed before it.\nType C-q to quote control character to search for it.\nType C-x 8 RET to add a character to search by Unicode name, with completion.\nC-g while searching or when search has failed cancels input back to what has\n been found successfully.\nC-g when search is successful aborts and moves point to starting point.\n\nIf you try to exit with the search string still empty, it invokes\n nonincremental search.\n\nType M-s c to toggle search case-sensitivity.\nType M-s i to toggle search in invisible text.\nType M-s r to toggle regular-expression mode.\nType M-s w to toggle word mode.\nType M-s _ to toggle symbol mode.\nType M-s ' to toggle character folding.\n\nType M-s SPC to toggle whitespace matching.\nIn incremental searches, a space or spaces normally matches any whitespace\ndefined by the variable ‘search-whitespace-regexp’; see also the variables\n‘isearch-lax-whitespace’ and ‘isearch-regexp-lax-whitespace’.\n\nType M-s e to edit the search string in the minibuffer.\n\nAlso supported is a search ring of the previous 16 search strings.\nType M-n to search for the next item in the search ring.\nType M-p to search for the previous item in the search ring.\nType C-M-i to complete the search string using the search ring.\n\nType M-% to run ‘query-replace’ with string to replace from last search string.\nType C-M-% to run ‘query-replace-regexp’ with the last search string.\nType M-s o to run ‘occur’ that shows the last search string.\nType M-s h r to run ‘highlight-regexp’ that highlights the last search string.\nType M-s h l to run ‘highlight-lines-matching-regexp’ that highlights lines\n matching the last search string.\n\nType C-h b to display all Isearch key bindings.\nType C-h k to display documentation of Isearch key.\nType C-h m to display documentation of Isearch mode.\n\nIf an input method is turned on in the current buffer, that input\nmethod is also active while you are typing characters to search.\nTo toggle the input method, type C-\\. It also toggles the input\nmethod in the current buffer.\n\nTo use a different input method for searching, type C-^,\nand specify an input method you want to use.\n\nTo activate a transient input method, type C-x \\.\n\nThe above keys, bound in ‘isearch-mode-map’, are often controlled by\n options; do M-x apropos on search-.* to find them.\nOther control and meta characters terminate the search\n and are then executed normally (depending on ‘search-exit-option’).\nLikewise for function keys and mouse button events.\n\nIf this function is called non-interactively with a nil NO-RECURSIVE-EDIT,\nit does not return to the calling function until the search is done.\nSee the function ‘isearch-mode’ for more information.\n\n(fn &optional REGEXP-P NO-RECURSIVE-EDIT)",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-force-normal-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to normal state without recording current command.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-end-of-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the last character of the current screen line.\nIf COUNT is given, move COUNT - 1 screen lines downward first.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inclusive-expand": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform expand transformation on inclusive from BEG to END with PROPERTIES.\n\nInclude the character under point.\nIf the end position is at the beginning of a line or the end of a\nline and `evil-want-visual-char-semi-exclusive', then:\n\n* If in visual state return `exclusive' (expanded).",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-column-left": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window COUNT columns to the left.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-definition-functions": {
+ "default": "(evil-goto-definition-imenu evil-goto-definition-semantic evil-goto-definition-xref evil-goto-definition-search)",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "List of functions run until success by `evil-goto-definition'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-check-buffers": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-direction": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The direction of the current search, either 'forward or 'backward.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-change-word-to-end": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `cw' behaves like `ce'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-make": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Call a build command in the current directory.\nIf ARG is nil this function calls `recompile', otherwise it calls\n`compile' passing ARG as build command.",
+ "arglist": [
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-quit-all-with-error-code": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Exits Emacs without saving, returning an non-zero error code.\nThe FORCE argument is only there for compatibility and is ignored.\nThis function fails with an error if Emacs is run in server mode.",
+ "arglist": [
+ "&optional",
+ "force"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Read a motion from the keyboard and return its buffer positions.\nThe return value is a list (BEG END), or (BEG END TYPE) if\nRETURN-TYPE is non-nil.",
+ "arglist": [
+ "&optional",
+ "return-type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-flatten-syntax-tree": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find all paths from the root of TREE to its leaves.\nTREE is a syntax tree, i.e., all its leave nodes are strings.\nThe `nth' element in the result is the syntactic context\nfor the corresponding string index (counted from zero).",
+ "arglist": [
+ "tree"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-argument-types": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Association list of argument handlers.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-switch-to-windows-last-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to current windows last open buffer.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-block-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return size of block from BEG to END with PROPERTIES.\n\nLike `inclusive', but for rectangles:\nthe last column is included.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-copy-chars-from-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return N characters from line NUM, starting at column COL.\nNUM is relative to the current line and can be negative.\nCOL defaults to the current column.",
+ "arglist": [
+ "n",
+ "num",
+ "&optional",
+ "col"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-list-view-mode-abbrev-table": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Abbrev table for `evil-list-view-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-on-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-visual-char-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Type of default ex range in visual char state.\nIf non-nil the default range when starting an ex command from\ncharacter visual state is `<,`> otherwise it is '<,'>. In the\nfirst case the ex command will be passed a region covering only\nthe visual selection. In the second case the passed region will\nbe extended to contain full lines.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paste-pop": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Replace the just-yanked stretch of killed text with a different stretch.\nThis command is allowed only immediatly after a `yank',\n`evil-paste-before', `evil-paste-after' or `evil-paste-pop'.\nThis command uses the same paste command as before, i.e., when\nused after `evil-paste-after' the new text is also yanked using\n`evil-paste-after', used with the same paste-count argument.\n\nThe COUNT argument inserts the COUNTth previous kill. If COUNT\nis negative this is a more recent kill.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-magic": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Meaning which characters in a pattern are magic.\nThe meaning of those values is the same as in Vim. Note that it\nonly has influence if the Evil search module is chosen in\n`evil-search-module'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-with-undo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY with enabled undo.\nIf undo is disabled in the current buffer, the undo information\nis stored in `evil-temporary-undo' instead of `buffer-undo-list'.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-select-quote-thing": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Selection THING as if it described a quoted object.\nTHING is typically either 'evil-quote or 'evil-chars. This\nfunction is called from `evil-select-quote'.",
+ "arglist": [
+ "thing",
+ "beg",
+ "end",
+ "_type",
+ "count",
+ "&optional",
+ "inclusive"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-enable-in-buffers": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-resume": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to Insert state at previous insertion point.\nThe insertion will be repeated COUNT times. If called from visual\nstate, only place point at the previous insertion position but do not\nswitch to insert state.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-undo-system": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set `evil-undo-function' and `evil-redo-function` by SYSTEM.",
+ "arglist": [
+ "system"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-this-motion": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Current motion.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-quit-all": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Exits Emacs, asking for saving.",
+ "arglist": [
+ "&optional",
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move lines in BEG END below line given by ADDRESS.",
+ "arglist": [
+ "beg",
+ "end",
+ "address"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-shell-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute a shell command.\nIf BEG, END and TYPE is specified, COMMAND is executed on the region,\nwhich is replaced with the command's output. Otherwise, the\noutput is displayed in its own buffer. If PREVIOUS is non-nil,\nthe previous shell command is executed instead.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "command",
+ "previous"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-C-u-scroll": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `C-u' scrolls up (like Vim).\nOtherwise, `C-u' applies a prefix argument. The binding of\n`C-u' mirrors Emacs behaviour by default due to the relative\nubiquity of prefix arguments.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-height": {
+ "default": 8,
+ "local": null,
+ "default-type": "integer",
+ "var-docstring": "Height (in lines) of the command line window.\nSet to 0 to use the default height for `split-window'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-local-map": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Buffer-local keymap for Motion state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--check-undo-system": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-start-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Start a new search in a certain DIRECTION.",
+ "arglist": [
+ "direction",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-previous": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Goes the the previous occurrence.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-screen-line-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return size of screen-line from BEG to END with PROPERTIES.\n\nInclude whole lines, being aware of `visual-line-mode'\nwhen `evil-respect-visual-line-mode' is non-nil.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-initializing-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether Evil is in the process of being initialized.",
+ "arglist": [
+ "&optional",
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-split-next-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Splits the window and goes to the COUNT-th next buffer in the buffer list.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-modes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Modes that should come up in Normal state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The buffer in which the repeat started.\nIf the buffer is changed, the repeat is cancelled.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-decrease-width": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Decrease current window width by COUNT.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-substitute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change a character.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-overlays": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the list of active overlays of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-previous-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Complete a whole line.\nCalls `evil-complete-previous-line-func'.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-C-i-jump": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `C-i' jumps forward in the jump list (like Vim).\nOtherwise, `C-i' inserts a tab character.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-text-object-make-linewise": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Turn the text object selection RANGE to linewise.\nThe selection is adjusted in a sensible way so that the selected\nlines match the user intent. In particular, whitespace-only parts\nat the first and last lines are omitted. This function returns\nthe new range.",
+ "arglist": [
+ "range"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state-minor-mode-keymaps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a keymap alist of minor-mode keymaps for STATE.",
+ "arglist": [
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-interactive-form": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evaluate interactive forms ARGS.\nThe return value is a cons cell (FORM . PROPERTIES),\nwhere FORM is a single list-expression to be passed to\na standard `interactive' statement, and PROPERTIES is a\nlist of command properties as passed to `evil-define-command'.",
+ "arglist": [
+ "&rest",
+ "args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-update-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the update-hook of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move backward to end of THING.\nThe motion is repeated COUNT times. This is the same as calling\n`evil-backward-end' with -COUNT.",
+ "arglist": [
+ "thing",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-concat-lists": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Concatenate lists, removing duplicates.\nElements are compared with `eq'.",
+ "arglist": [
+ "&rest",
+ "sequences"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-flash-timer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Timer for flashing search results.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-pop-next": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Same as `evil-repeat-pop', but with negative COUNT.",
+ "arglist": [
+ "count",
+ "&optional",
+ "save-point"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-member-if": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find the first item satisfying PREDICATE in LIST.\nStop when reaching POINTER, which should point at a link\nin the list.",
+ "arglist": [
+ "predicate",
+ "list",
+ "&optional",
+ "pointer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point to the end or beginning of a string.\nQUOTE is the character delimiting the string. If COUNT is greater\nthan zero point is moved forward otherwise it is moved\nbackwards.",
+ "arglist": [
+ "quote",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-looking-at-end-comment": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns t if point is at the end of a comment.\npoint must be on one of the opening characters of a block comment\naccording to the current syntax table. Futhermore these\ncharacters must been parsed as opening characters, i.e. they\nwon't be considered as comment starters inside a string or\npossibly another comment. Point is moved right after the comment\ncloser if MOVE is non-nil.",
+ "arglist": [
+ "&optional",
+ "move"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-select-block": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a range (BEG END) of COUNT delimited text objects.\nBEG END TYPE are the currently selected (visual) range. The\ndelimited object must be given by THING-up function (see\n`evil-up-block').\n\nSELECTION-TYPE is symbol that determines which parts of the block\nare selected. If it is 'inclusive or t OPEN and CLOSE are\nincluded in the range. If it is 'exclusive or nil the delimiters\nare not contained. If it is 'exclusive-line the delimiters are\nnot included as well as adjacent whitespace until the beginning\nof the next line or the end of the previous line. If the\nresulting selection consists of complete lines only and visual\nstate is not active, the returned selection is linewise.\n\nIf COUNTCURRENT is non-nil an objected is counted if the current\nselection matches that object exactly.\n\nUsually scanning for the surrounding block starts at (1+ beg)\nand (1- end). If this might fail due to the behavior of THING\nthen FIXEDSCAN can be set to t. In this case the scan starts at\nBEG and END. One example where this might fail is if BEG and END\nare the delimiters of a string or comment.",
+ "arglist": [
+ "thing",
+ "beg",
+ "end",
+ "type",
+ "count",
+ "&optional",
+ "selection-type",
+ "countcurrent",
+ "fixedscan"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-make-argument-handler": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "runner",
+ "completer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-write-all": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Saves all buffers visiting a file.\nIf BANG is non nil then read-only buffers are saved, too,\notherwise they are skipped. ",
+ "arglist": [
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-loop": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Loop a certain number of times.\nEvaluate BODY repeatedly COUNT times with VAR bound to 1 or -1,\ndepending on the sign of COUNT. RESULT, if specified, holds\nthe number of unsuccessful iterations, which is 0 if the loop\ncompletes successfully. This is also the return value.\n\nEach iteration must move point; if point does not change,\nthe loop immediately quits. See also `evil-loop'.\n\n(fn (VAR COUNT [RESULT]) BODY...)",
+ "arglist": [
+ "spec",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-goto-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to POSITION in the buffer.\nDefault position is the beginning of the buffer.",
+ "arglist": [
+ "position"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-macro-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The buffer that has been active on macro recording.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-overriding-maps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymaps that should override Evil maps.\nEntries have the form (MAP-VAR . STATE), where MAP-VAR is\na keymap variable and STATE is the state whose bindings\nshould be overridden. If STATE is nil, all states are\noverridden.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--next-flyspell-error": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "forwardp"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-execute-repeat-info-with-count": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat the repeat-information REPEAT-INFO with the count of\nthe first command replaced by COUNT. The count is replaced if\nand only if COUNT is non-nil.",
+ "arglist": [
+ "count",
+ "repeat-info"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-list-view-mode-syntax-table": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Syntax table for `evil-list-view-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-yank-lines": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Saves the lines in the region BEG and END into the kill-ring.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-word": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move by words.\nMoves point COUNT words forward or (- COUNT) words backward if\nCOUNT is negative. This function is the same as `forward-word'\nbut returns the number of words by which point could *not* be\nmoved.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-recording-current-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether we are recording the current command for repeat.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-start": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Start recording a new repeat into `evil-repeat-info'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-modes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Modes that should come up in Operator-Pending state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-modified-and-close": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Saves the current buffer and closes the window.",
+ "arglist": [
+ "file",
+ "&optional",
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-double-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a double-quoted expression.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-definition-imenu": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find definition for STRING with imenu.",
+ "arglist": [
+ "string",
+ "_position"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-range-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether OBJECT is a range.",
+ "arglist": [
+ "object"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-word-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for the next occurrence of word under the cursor.",
+ "arglist": [
+ "&optional",
+ "count",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-yank-handler": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the yank handler for MOTION.\nMOTION defaults to the current motion.",
+ "arglist": [
+ "&optional",
+ "motion"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paste-last-insertion-and-stop-insert": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Paste last insertion and change to normal state.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Cursor for Normal state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-record-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set `evil-repeat-buffer' to the current buffer.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-digraph": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Convert DIGRAPH to character or list representation.\nIf DIGRAPH is a list (CHAR1 CHAR2), return the corresponding character;\nif DIGRAPH is a character, return the corresponding list.\nSearches in `evil-digraphs-table-user' and `evil-digraphs-table'.",
+ "arglist": [
+ "digraph"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-idle-update": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Triggers the timer to update the highlights in the current buffer.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-eval-history": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "History of eval input, from the `=' register.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-word-or-subword-1": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-word-or-subword-1'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-end-undo-step": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "End a undo step started with `evil-start-undo-step'.\nAdds an undo boundary unless CONTINUE is specified.",
+ "arglist": [
+ "&optional",
+ "continue"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-rot13": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "ROT13 encrypt text.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-execute-change": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Executes as list of changes.\n\nCHANGES is a list of triples (REL-BEG INSERT-TEXT NDEL).\nREL-BEG is the relative position (to point) where the change\ntakes place. INSERT-TEXT is the text to be inserted at that\nposition and NDEL the number of characters to be deleted at that\nposition before insertion.\n\nREL-POINT is the relative position to point before the changed\nwhere point should be placed after all changes.",
+ "arglist": [
+ "changes",
+ "rel-point"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-count-reset": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Sets `evil-scroll-count' to 0.\n`evil-scroll-up' and `evil-scroll-down' will scroll\nfor a half of the screen(default).",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-update-replace-alist": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Add CHARS-TO-DELETE chars to evil-replace-alist, starting at OPOINT.\nIf COUNT is greater than CHARS-TO-DELETE, pad the alist with nils.\nDecrement recorded position by optional offset, or 0.",
+ "arglist": [
+ "opoint",
+ "count",
+ "chars-to-delete",
+ "&optional",
+ "offset"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-plist-delete": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete by side effect the property PROP from PLIST.\nIf PROP is the first property in PLIST, there is no way\nto remove it by side-effect; therefore, write\n(setq foo (evil-plist-delete :prop foo)) to be sure of\nchanging the value of `foo'.",
+ "arglist": [
+ "prop",
+ "plist"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-read-quoted-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Command that calls `read-quoted-char'.\nThis command can be used wherever `read-quoted-char' is required\nas a command. Its main use is in the `evil-read-key-map'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-local-mode-on-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-without-display": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY without Evil displays.\nInhibits echo area messages, mode line updates and cursor changes.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-set-custom-state-maps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Changes the list of special keymaps.\nVAR is the variable containing the list of keymaps.\nPENDING-VAR is the variable containing the list of the currently pending\n keymaps.\nKEY the special symbol to be stored in the keymaps.\nMAKE the creation function of the special keymaps.\nNEWLIST the list of new special keymaps.",
+ "arglist": [
+ "var",
+ "pending-var",
+ "key",
+ "_make",
+ "newlist"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-local-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Motion state is enabled.\nUse the command `evil-motion-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-sentence": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-newline-below": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Inserts a new line below point and places point in that line\nwith regard to indentation.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--preceding-sexp": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "In normal-state or motion-state, last sexp ends at point.",
+ "arglist": [
+ "command",
+ "&rest",
+ "args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-regexp-search": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-motion-state-map>\nWhether to use regular expressions for searching in \\[evil-search-forward] and \\[evil-search-backward].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-move-far-left": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Closes the current window, splits the upper-left one vertically\nand redisplays the current buffer there.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-show-jumps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Display the contents of the jump list.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-half-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change cursor to a half-height box.\n(This is really just a thick horizontal bar.)",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-curly": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner curly bracket (\"brace\").",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-post-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Run after each COMMAND in Visual state.\nIf COMMAND is a motion, refresh the selection;\notherwise exit Visual state.",
+ "arglist": [
+ "&optional",
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-toggle-key": {
+ "default": "C-z",
+ "local": null,
+ "default-type": "string",
+ "var-docstring": "The key used to change to and from Emacs state.\nMust be readable by `read-kbd-macro'. For example: \"C-z\".",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-keybindings": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-parse-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Parse STRING as an Ex binding.",
+ "arglist": [
+ "string"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-paste": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Paste over Visual selection.",
+ "arglist": [
+ "count",
+ "&optional",
+ "register"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-next-func": {
+ "default": "(closure (dabbrev-case-distinction dabbrev-search-these-buffers-only t) (arg) (require 'dabbrev) (let ((dabbrev-search-these-buffers-only (if evil-complete-all-buffers nil (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)))))",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Completion function used by \\<evil-insert-state-map>\\[evil-complete-next].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-back-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a back-quoted expression.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-close-fold": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Close fold at point.\nSee also `evil-open-fold'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Echo area message for Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-backspace": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restore character under cursor.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-initial-state-for-buffer-name": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the initial Evil state to use for a buffer with name NAME.\nMatches the name against the regular expressions in\n`evil-buffer-regexps'. If none matches, returns DEFAULT.",
+ "arglist": [
+ "&optional",
+ "name",
+ "default"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-previous": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat the last search in the opposite direction.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-goal-column": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restores the goal column after execution of BODY.\nSee also `evil-save-column'.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-ex-interactive-search-highlight": {
+ "default": "all-windows",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Determine in which windows the interactive highlighting should be shown.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-visual-newline-commands": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the value of `evil-visual-newline-commands'.\nSetting this variable changes the properties of the appropriate\ncommands.",
+ "arglist": [
+ "var",
+ "value"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-forward-history": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "History of forward searches.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mouse--remap-link-click-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "start-event",
+ "end-event"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-esc-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if `evil-esc-mode' is enabled.",
+ "fn-docstring": "Toggle interception of \\e (escape).\nEnable with positive ARG and disable with negative ARG.\n\nWhen enabled, `evil-esc-mode' modifies the entry of \\e in\n`input-decode-map'. If such an event arrives, it is translated to\na plain 'escape event if no further event occurs within\n`evil-esc-delay' seconds. Otherwise no translation happens and\nthe ESC prefix map (i.e. the map originally bound to \\e in\n`input-decode-map`) is returned.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-kill-on-visual-paste": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether pasting in visual state adds the replaced text to the\nkill ring, making it the default for the next paste. The default,\nreplicates the default Vim behavior.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-backward-word": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete previous word.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-invert-case": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Invert case of text.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-local-set-key": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Bind KEY to DEF in STATE in the current buffer.",
+ "arglist": [
+ "state",
+ "key",
+ "def"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Prefix STRING with the search prompt.",
+ "arglist": [
+ "string",
+ "forward"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-screen-line-contract": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform contract transformation on screen-line from BEG to END with PROPERTIES.\n\nInclude whole lines, being aware of `visual-line-mode'\nwhen `evil-respect-visual-line-mode' is non-nil.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-restore-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restore the mark, including whether it was transient.\nSee also `evil-save-mark'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-contract-region": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The inverse of `evil-visual-expand-region'.\nCreate a Visual selection that expands to the current region.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Called to record a search command.\nFLAG is either 'pre or 'post if the function is called before resp.\nafter executing the command.",
+ "arglist": [
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-regex-case": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the case as implied by \\c or \\C in regular expression RE.\nIf \\c appears anywhere in the pattern, the pattern is case\ninsensitive. If \\C appears, the pattern is case sensitive.\nOnly the first occurrence of \\c or \\C is used, all others are\nignored. If neither \\c nor \\C appears in the pattern, the case\nspecified by DEFAULT-CASE is used. DEFAULT-CASE should be either\n`sensitive', `insensitive' or `smart'. In the latter case, the pattern\nwill be case-sensitive if and only if it contains an upper-case\nletter, otherwise it will be case-insensitive.",
+ "arglist": [
+ "re",
+ "default-case"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-update-pending-maps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Tries to set pending special keymaps.\nThis function should be called from an `after-load-functions'\nhook.",
+ "arglist": [
+ "&optional",
+ "_file"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-narrow-to-field": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Narrow to the current field.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-ex-expression": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The evaluation tree.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-overlay": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-open-fold-rec": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open fold at point recursively.\nSee also `evil-open-fold' and `evil-close-fold'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-exit-emacs-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Exit Emacs state.\nChanges the state to the previous state, or to Normal state\nif the previous state was Emacs state.",
+ "arglist": [
+ "&optional",
+ "buffer",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Starts a forward search.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-find-symbol": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return word near point as a string.\nIf FORWARD is nil, search backward, otherwise forward. Returns\nnil if nothing is found.",
+ "arglist": [
+ "forward"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-run-pending-custom-initialize": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Executes the pending initializations.\nSee `evil-pending-custom-initialize'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-delete-or-yank": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute evil-delete or evil-yank on the given region.\nIf SHOULD-DELETE is t, evil-delete will be executed, otherwise\nevil-yank.\nThe region specified by BEG and END will be adjusted if COUNT is\ngiven.",
+ "arglist": [
+ "should-delete",
+ "beg",
+ "end",
+ "type",
+ "register",
+ "count",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-exit-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when exiting Motion state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-declare-ignore-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Declare COMMAND to be nonrepeatable.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-case": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The case behaviour of the search command.\nSmart case means that the pattern is case sensitive if and only\nif it contains an upper case letter, otherwise it is case\ninsensitive. If nil then the setting of `evil-ex-search-case' is\nused.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normalize-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Normalize RANGE according to its type.\nReturn a new range if COPY is non-nil.",
+ "arglist": [
+ "range",
+ "&optional",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-find-word": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return word near point as a string.\nIf FORWARD is nil, search backward, otherwise forward. Returns\nnil if nothing is found.",
+ "arglist": [
+ "forward"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-declare-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Declare COMMAND to be repeatable.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-C-w-in-emacs-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `C-w' prefixes windows commands in Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct-ring--cmacro": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "compiler-macro for inlining `evil-jumps-struct-ring'.",
+ "arglist": [
+ "_cl-whole-arg",
+ "cl-x"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-count-lines": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return absolute line-number-difference betweeen `beg` and `end`.\nThis should give the same results no matter where on the line `beg`\nand `end` are.",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-re-bwd": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search backward for PATTERN.\nReturns the line number of the match.",
+ "arglist": [
+ "pattern"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-setup": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Initialize Ex minibuffer.\nThis function registers several hooks that are used for the\ninteractive actions during ex state.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-contract-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Contract RANGE according to its type.\nReturn a new range if COPY is non-nil.",
+ "arglist": [
+ "range",
+ "&optional",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-with-predicate": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute a search with a predicate function.\nSEARCH-FUN is a search function (e.g. `re-search-forward') and\nPREDICATE is a two-argument function satisfying the interface of\n`isearch-filter-predicate', or `nil'. STRING, BOUND, NOERROR and\nCOUNT are passed unchanged to SEARCH-FUN. The first match\nsatisfying the predicate (or `nil') is returned.",
+ "arglist": [
+ "search-fun",
+ "pred",
+ "string",
+ "bound",
+ "noerror",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-prompt": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "String to use for search prompt.",
+ "fn-docstring": "Return the search prompt for the given direction.",
+ "arglist": [
+ "forward"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-local-var": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define SYMBOL as permanent buffer local variable, and return SYMBOL.\nThe parameters are the same as for `defvar', but the variable\nSYMBOL is made permanent buffer local.",
+ "arglist": [
+ "symbol",
+ "&optional",
+ "initvalue",
+ "docstring"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-define-motion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define a motion command MOTION.\nARGS is a list of arguments. Motions can have any number of\narguments, but the first (if any) has the predefined meaning of\ncount. BODY must execute the motion by moving point.\n\nOptional keyword arguments are:\n- `:type' - determines how the motion works after an operator (one of\n `inclusive', `line', `block' and `exclusive', or a self-defined\n motion type)\n- `:jump' - if non-nil, the previous position is stored in the jump\n list, so that it can be restored with \\<evil-motion-state-map>\\[evil-jump-backward]\n\n(fn MOTION (COUNT ARGS...) DOC [[KEY VALUE]...] BODY...)",
+ "arglist": [
+ "motion",
+ "args",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-operator-state-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Operator-Pending state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-inner-symbol": "i o",
+ "evil-inner-tag": "i t",
+ "evil-inner-back-quote": "i `",
+ "evil-inner-double-quote": "i \"",
+ "evil-inner-single-quote": "i '",
+ "evil-inner-angle": "i >",
+ "evil-inner-angle": "i >",
+ "evil-inner-curly": "i }",
+ "evil-inner-curly": "i }",
+ "evil-inner-curly": "i }",
+ "evil-inner-bracket": "i ]",
+ "evil-inner-bracket": "i ]",
+ "evil-inner-paren": "i )",
+ "evil-inner-paren": "i )",
+ "evil-inner-paren": "i )",
+ "evil-inner-paragraph": "i p",
+ "evil-inner-sentence": "i s",
+ "evil-inner-WORD": "i W",
+ "evil-inner-word": "i w",
+ "evil-a-symbol": "a o",
+ "evil-a-tag": "a t",
+ "evil-a-back-quote": "a `",
+ "evil-a-double-quote": "a \"",
+ "evil-a-single-quote": "a '",
+ "evil-an-angle": "a >",
+ "evil-an-angle": "a >",
+ "evil-a-curly": "a }",
+ "evil-a-curly": "a }",
+ "evil-a-curly": "a }",
+ "evil-a-bracket": "a ]",
+ "evil-a-bracket": "a ]",
+ "evil-a-paren": "a )",
+ "evil-a-paren": "a )",
+ "evil-a-paren": "a )",
+ "evil-a-paragraph": "a p",
+ "evil-a-sentence": "a s",
+ "evil-a-WORD": "a W",
+ "evil-a-word": "a w"
+ }
+ },
+ "evil-local-keymaps-alist": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Association list of keymap variables that must be\nreinitialized in each buffer. Entries have the form\n(MODE . KEYMAP), where KEYMAP is the variable containing\nthe keymap for MODE.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-range-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set RANGE's properties to PROPERTIES.\nIf COPY is non-nil, return a copy of RANGE.",
+ "arglist": [
+ "range",
+ "properties",
+ "&optional",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-swap-out-markers": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Turn markers into file references when the buffer is killed.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-display-shell-error-in-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Show error output of a shell command in the error buffer.\nIf this variable is non-nil the error output of a shell command\ngoes to the messages buffer instead of being mixed with the\nregular output. This happens only if the exit status of the\ncommand is non-zero.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-lookup": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Look up the keyword at point.\nCalls `evil-lookup-func'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-newline-above": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Inserts a new line above point and places point in that line\nwith regard to indentation.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-split": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Splits the current window horizontally, COUNT lines height,\nediting a certain FILE. The new window will be created below\nwhen `evil-split-window-below' is non-nil. If COUNT and\n`evil-auto-balance-windows' are both non-nil then all children\nof the parent of the splitted window are rebalanced.",
+ "arglist": [
+ "&optional",
+ "count",
+ "file"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-char-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Characterwise selection.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-complete-previous-minibuffer-func": {
+ "default": "minibuffer-complete",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Minibuffer completion function used by \\<evil-insert-state-map>\\[evil-complete-previous].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-ring": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "A ring of repeat-informations to repeat the last command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-integration": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether to load evil-integration.el.\nThis variable must be set before Evil is loaded.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-downcase": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Convert text to lower case.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-set-width": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Sets the width of the current window to COUNT.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-x-select-timeout": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Time in seconds for the update of the X selection.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-local-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Insert state is enabled.\nUse the command `evil-insert-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ace-jump-word-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Jump visually to the beginning of a word using ace-jump.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-different-buffer-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the buffer has changed in a repeat.\nIf STRICT is non-nil, returns t if the previous buffer\nis unknown; otherwise returns t only if the previous\nbuffer is known and different from the current buffer.",
+ "arglist": [
+ "&optional",
+ "strict"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-declare-key": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create a STATE binding from KEY to DEF for KEYMAP.\nSTATE is one of `normal', `insert', `visual', `replace',\n`operator', `motion', `emacs', or a list of one or more of\nthese. Omitting a state by using `nil' corresponds to a standard\nEmacs binding using `define-key'. The remaining arguments are\nlike those of `define-key'. For example:\n\n (evil-define-key 'normal foo-map \"a\" 'bar)\n\nThis creates a binding from `a' to `bar' in normal state, which\nis active whenever `foo-map' is active. Using nil for the state,\nthe following lead to identical bindings:\n\n (evil-define-key nil foo-map \"a\" 'bar)\n (define-key foo-map \"a\" 'bar)\n\nIt is possible to specify multiple states and/or bindings at\nonce:\n\n (evil-define-key '(normal visual) foo-map\n \"a\" 'bar\n \"b\" 'foo)\n\nIf `foo-map' has not been initialized yet, this macro adds an\nentry to `after-load-functions', delaying execution as necessary.\n\nKEYMAP may also be a quoted symbol. If the symbol is `global', the\nglobal evil keymap corresponding to the state(s) is used, meaning\nthe following lead to identical bindings:\n\n (evil-define-key 'normal 'global \"a\" 'bar)\n (evil-global-set-key 'normal \"a\" 'bar)\n\nThe symbol `local' may also be used, which corresponds to using\n`evil-local-set-key'. If a quoted symbol is used that is not\n`global' or `local', it is assumed to be the name of a minor\nmode, in which case `evil-define-minor-mode-key' is used.",
+ "arglist": [
+ "state",
+ "keymap",
+ "key",
+ "def",
+ "&rest",
+ "bindings"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-with-transient-mark-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY with Transient Mark mode.\nThen restore Transient Mark mode to its previous setting.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-ex-sort-completions": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "completions"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-highlight-closing-paren-at-point-states": {
+ "default": "(not emacs insert replace)",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "The states in which the closing parenthesis at point should be highlighted.\nAll states listed here highlight the closing parenthesis at\npoint (which is Vim's default behavior). All others highlight the\nparenthesis before point (which is Emacs default behavior). If\nthis list contains the symbol `not' then its meaning is inverted,\ni.e. all states listed here highlight the closing parenthesis\nbefore point.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-macros": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the pattern of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-info-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-change-to-initial-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change the state of BUFFER to its initial state.\nThis is the state the buffer came up in. If Evil is not activated\nthen this function does nothing.",
+ "arglist": [
+ "&optional",
+ "buffer",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-exclusive-normalize": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform normalize transformation on exclusive from BEG to END with PROPERTIES.\n\nReturn the positions unchanged, with some exceptions.\nIf the end position is at the beginning of a line, then:\n\n* If the beginning position is at or before the first non-blank\n character on the line, return `line' (expanded).\n\n* Otherwise, move the end position to the end of the previous\n line and return `inclusive' (expanded).",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-activate-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Visual state if the region is activated.",
+ "arglist": [
+ "&optional",
+ "_command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-posn-x-y": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the x and y coordinates in POSITION.\nThis function returns y offset from the top of the buffer area including\nthe header line and the tab line (on Emacs 27 and later versions).\n\nOn Emacs 24 and later versions, the y-offset returned by\n`posn-at-point' is relative to the text area excluding the header\nline and the tab line, while y offset taken by `posn-at-x-y' is relative to\nthe buffer area including the header line and the tab line.\nThis asymmetry is by design according to GNU Emacs team.\nThis function fixes the asymmetry between them.\n\nLearned from mozc.el.",
+ "arglist": [
+ "position"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-argument-handler-runner": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "arg-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-count": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The explicit count passed to an command starting Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-word-1-above": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-word-1-above'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-setup": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Hook to initialize the minibuffer for ex search.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-find-next-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Look for the next occurrence of PATTERN in a certain DIRECTION.\nNote that this function ignores the whole-line property of PATTERN.",
+ "arglist": [
+ "pattern",
+ "&optional",
+ "direction"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-after-load-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Functions to be run when loading of Evil is finished.\nThis hook can be used the execute some initialization routines\nwhen Evil is completely loaded.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-type-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Specifications made by `evil-define-type'.\nEntries have the form (TYPE . PLIST), where PLIST is a property\nlist specifying functions for handling the type: expanding it,\ndescribing it, etc.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mouse-drag-region": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the region to the text that the mouse is dragged over.\nHighlight the drag area as you move the mouse.\nThis must be bound to a button-down mouse event.\n\nIf the click is in the echo area, display the `*Messages*' buffer.\n\nSTART-EVENT should be the event that started the drag.",
+ "arglist": [
+ "start-event"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Operator-Pending state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "cl-x"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-set-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the pattern of the highlight HL to PATTERN.",
+ "arglist": [
+ "hl",
+ "pattern"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-local-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Visual state is enabled.\nUse the command `evil-visual-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-repeat-info": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY, protecting the values of repeat variables.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-word": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a tag block.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-default-cursor": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The default cursor.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-start-word-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for the symbol under point.\nThe search matches the COUNT-th occurrence of the word. If the\nUNBOUNDED argument is nil, the search matches only at symbol\nboundaries, otherwise it matches anywhere. The DIRECTION\nargument should be either `forward' or `backward', determining\nthe search direction. If SYMBOL is non-nil then the functions\nsearches for the symbol at point, otherwise for the word at\npoint.",
+ "arglist": [
+ "unbounded",
+ "direction",
+ "count",
+ "&optional",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-local-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Replace state is enabled.\nUse the command `evil-replace-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-cross-lines": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-motion-state-map>\nWhether horizontal motions may move to other lines. If non-nil,\ncertain motions that conventionally operate in a single line may move\nthe cursor to other lines. Otherwise, they are restricted to the\ncurrent 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].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-unbounded-word-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for the next occurrence of word under the cursor.",
+ "arglist": [
+ "&optional",
+ "count",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-append-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to Insert state at the end of the current line.\nThe insertion will be repeated COUNT times. If VCOUNT is non nil\nit should be number > 0. The insertion will be repeated in the\nnext VCOUNT - 1 lines below the current one.",
+ "arglist": [
+ "count",
+ "&optional",
+ "vcount"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-line-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Linewise selection.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-move-cursor": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-normal-state-map>\nWhether repeating commands with \\[evil-repeat] may move the cursor.\nIf nil, the original cursor position is preserved, even if the command\nnormally would have moved the cursor.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-block-overlays": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Overlays for Visual Block selection, one for each line.\nThey are reused to minimize flicker.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-line-to-bottom": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls line number COUNT (or the cursor line) to the bottom of the window.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ret": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT lines down.\nIf point is on a widget or a button, click on it.\nIn Insert state, insert a newline.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-highlight": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Highlight Visual selection, depending on the Visual type.\nWith negative ARG, disable highlighting.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-init-esc": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update `input-decode-map' in terminal.",
+ "arglist": [
+ "frame"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-quote-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The character to be used by `forward-evil-quote'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-back-to-indentation": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete back to the first non-whitespace character.\nIf point is before the first non-whitespace character of a\ncurrent line then delete from the point to the beginning of the\ncurrent line. If point is on the beginning of the line, behave\naccording to `evil-backspace-join-lines'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-ignored-file-patterns": {
+ "default": "(\"COMMIT_EDITMSG$\" \"TAGS$\")",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "A list of pattern regexps to match on the file path to exclude from being included in the jump list.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-visual-char-semi-exclusive": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Visual character selection to beginning/end of line is exclusive.\nIf non nil then an inclusive visual character selection which\nends at the beginning or end of a line is turned into an\nexclusive selection. Thus if the selected (inclusive) range ends\nat the beginning of a line it is changed to not include the first\ncharacter of that line, and if the selected range ends at the end\nof a line it is changed to not include the newline character of\nthat line.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paste-last-insertion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Paste last insertion.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-prev": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the previous window in the cyclic order.\nWith COUNT go to the count-th window in the order starting from\ntop-left.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-message": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create an echo area message for SELECTION.\nSELECTION is a kind of selection as defined by\n`evil-define-visual-selection', such as `char', `line'\nor `block'.",
+ "arglist": [
+ "&optional",
+ "selection"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-custom-initialize-pending-reset": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Add a pending customization with `custom-initialize-reset'.",
+ "arglist": [
+ "var",
+ "value"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-not-thing": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point to the end or beginning of the complement of THING.",
+ "arglist": [
+ "thing",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-undo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Undo COUNT changes in buffer using `evil-undo-function'.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-line-tag": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Mode-Line indicator for the current state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-shortcut-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Operator-Pending shortcuts like \"dd\" and \"gqq\".",
+ "fn-docstring": "Keymap for Operator-Pending shortcuts like \"dd\" and \"gqq\".",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Normal state is enabled.\nUse the command `evil-normal-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normalize-keymaps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create a buffer-local value for `evil-mode-map-alist'.\nThis is a keymap alist, determined by the current state\n(or by STATE if specified).",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-line-format": {
+ "default": "before",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The position of the state tag in the mode line.\nIf set to `before' or `after', the tag is placed at the beginning\nor the end of the mode-line, respectively. If nil, there is no\ntag. Otherwise it should be a cons cell (WHERE . WHICH), where\nWHERE is either `before' or `after', and WHICH is a symbol in\n`mode-line-format'. The tag is then placed before or after that\nsymbol, respectively.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-echo-area": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save the echo area; execute BODY; restore the echo area.\nIntermittent messages are not logged in the *Messages* buffer.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-ex-search-count": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The count if the current search.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-local-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Emacs state is enabled.\nUse the command `evil-emacs-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-make-hl": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create a new highlight object with name NAME and properties ARGS.\nThe following properties are supported:\n:face The face to be used for the highlighting overlays.\n:win The window in which the highlighting should be shown.\n Note that the highlight will be visible in all windows showing\n the corresponding buffer, but only the matches visible in the\n specified window will actually be highlighted. If :win is nil,\n the matches in all windows will be highlighted.\n:min The minimal buffer position for highlighted matches.\n:max The maximal buffer position for highlighted matches.\n:match-hook A hook to be called once for each highlight.\n The hook must take two arguments, the highlight and\n the overlay for that highlight.\n:update-hook A hook called once after updating the highlighting\n with two arguments, the highlight and a message string\n describing the current match status.",
+ "arglist": [
+ "name",
+ "&rest",
+ "args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-range-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return end of RANGE.",
+ "arglist": [
+ "range"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-nohighlight": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Disable the active search highlightings.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-paragraph": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner paragraph.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-local-mode-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-increase-height": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Increase current window height by COUNT.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-this-type-modified": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil iff current motion type has been modified by the user.\nIf the type has been modified, this variable contains the new\ntype.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-keys": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The keys that invoked the current command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-re-fwd": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search forward for PATTERN.\nReturns the line number of the match.",
+ "arglist": [
+ "pattern"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Major mode for the Evil command line window.\n\nThis mode runs the hook `evil-command-window-mode-hook', as the final\nor penultimate step during initialization.\n\n\\{evil-command-window-mode-map}",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-initialize-local-keymaps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Initialize a buffer-local value for local keymaps as necessary.\nThe initial value is that of `make-sparse-keymap'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the current state is Visual state.\n(That is, whether `evil-state' is `visual'.)",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-echo-state": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether to signal the current state in the echo area.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ace-jump-active": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-file-arg": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns the current Ex argument as a file name.\nThis function interprets special file names like # and %.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-record-change": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Record the current buffer changes during a repeat.\nIf CHANGE is specified, it is added to `evil-repeat-changes'.",
+ "arglist": [
+ "relpos",
+ "ins",
+ "ndel"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save the current buffer to FILENAME.\nChanges the file name of the current buffer to FILENAME. If no\nFILENAME is given, the current file name is used.",
+ "arglist": [
+ "filename",
+ "&optional",
+ "bang"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-refresh-undo-step": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Refresh `buffer-undo-list' entries for current undo step.\nUndo boundaries until `evil-undo-list-pointer' are removed to\nmake the entries undoable as a single action. See\n`evil-start-undo-step'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-buffer-targets": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Regexp to match against `buffer-name' to determine whether it's a valid jump target.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-concat-charsets": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Concatenate character sets.\nA character set is the part between [ and ] in a regular expression.\nIf any character set is complemented, the result is also complemented.",
+ "arglist": [
+ "&rest",
+ "sets"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-modes": {
+ "default": "(5x5-mode archive-mode bbdb-mode biblio-selection-mode blackbox-mode bookmark-bmenu-mode bookmark-edit-annotation-mode browse-kill-ring-mode bs-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)",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Modes that should come up in Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-invert-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Invert case of character.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jump-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to newer position in jump list.\nTo go the other way, press \\<evil-motion-state-map>\\[evil-jump-backward].",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-active-highlights-alist": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "An alist of currently active highlights.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-shortcut-map": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Operator-Pending shortcuts like \"dd\" and \"gqq\".",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-shift-right-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shift the current line COUNT times to the right.\nThe text is shifted to the nearest multiple of\n`evil-shift-width'. Like `evil-shift-right' but always works on\nthe current line.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Normal state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.\n\nAKA \"Command\" state.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-single-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a single-quoted expression.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-set-initial-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the initial state for the current major mode to STATE.\nThis is the state the buffer comes up in. See `evil-set-initial-state'.",
+ "arglist": [
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-resize": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The ex :resize command.\n\nIf ARG is a signed positive integer, increase the current window\nheight by ARG.\n\nIf ARG is a signed negative integer, decrease the current window\nheight by ARG.\n\nIf ARG is a positive integer without explicit sign, set the current\nwindow height to ARG.\n\nIf ARG is empty, maximize the current window height.",
+ "arglist": [
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-echo-area-restore": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restore the echo area from `evil-echo-area-message'.\nDoes not restore if `evil-write-echo-area' is non-nil.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-prev-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Goes to the `count'-th prev buffer in the buffer list.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-show-paren-range": {
+ "default": 0,
+ "local": null,
+ "default-type": "integer",
+ "var-docstring": "The minimal distance between point and a parenthesis\nwhich causes the parenthesis to be highlighted.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-echo-overlay": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Overlay used for displaying info messages during ex.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-register": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return contents of REGISTER.\nSignal an error if empty, unless NOERROR is non-nil.\n\nThe following special registers are supported.\n \" the unnamed register\n * the clipboard contents\n + the clipboard contents\n <C-w> the word at point (ex mode only)\n <C-a> the WORD at point (ex mode only)\n <C-o> the symbol at point (ex mode only)\n <C-f> the current file at point (ex mode only)\n % the current file name (read only)\n # the alternate file name (read only)\n / the last search pattern (read only)\n : the last command line (read only)\n . the last inserted text (read only)\n - the last small (less than a line) delete\n _ the black hole register\n = the expression register (read only)",
+ "arglist": [
+ "register",
+ "&optional",
+ "noerror"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct-ring": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Access slot \"ring\" of `evil-jumps-struct' struct CL-X.",
+ "arglist": [
+ "cl-x"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-transient-vals": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Association list of old values for Transient Mark mode variables.\nEntries have the form (VARIABLE VALUE LOCAL), where LOCAL is\nwhether the variable was previously buffer-local.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-cjk-emacs-word-boundary": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Determine word boundary exactly the same way as Emacs does.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-push": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Pushes the current cursor/file position to the jump list.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-page-up": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window COUNT pages upwards.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-small-deletion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last piece of deleted text.\nThe text should be less than a line.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-parser--dval": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Substitute all dollar-sign symbols in OBJ.\nEach dollar-sign symbol is replaced with the corresponding\nelement in RESULT, so that $1 becomes the first element, etc.\nThe special value $0 is substituted with the whole list RESULT.\nIf RESULT is not a list, all dollar-sign symbols are substituted with\nRESULT.",
+ "arglist": [
+ "obj",
+ "result"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-argument": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The current argument of the Ex command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-list-view-goto-entry": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-update-x-selection-p": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether to update the X PRIMARY selection with the current visual region automatically.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-append-register": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Append TEXT to the contents of register REGISTER.",
+ "arglist": [
+ "register",
+ "text"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-remove-default": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Remove the default text shown in the ex minibuffer.\nWhen ex starts, the previous command is shown enclosed in\nparenthesis. This function removes this text when the first key\nis pressed.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ace-jump-char-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Jump visually directly to a char using ace-jump.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-register": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the contents of register REGISTER to TEXT.\nIf REGISTER is an upcase character then text is appended to that\nregister instead of replacing its content.",
+ "arglist": [
+ "register",
+ "text"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-unquote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return EXP unquoted.",
+ "arglist": [
+ "exp"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-sentence": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-abort": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Cancel ex state when another buffer is selected.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-local-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Normal state is enabled.\nUse the command `evil-normal-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-get-current": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "&optional",
+ "window"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-read": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Inserts the contents of FILE below the current line or line COUNT.",
+ "arglist": [
+ "count",
+ "file"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-range-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return properties of RANGE.",
+ "arglist": [
+ "range"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--flyspell-overlays-in-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-col-0-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set MARK at column 0 of line of END. Default is cursor line.",
+ "arglist": [
+ "beg",
+ "end",
+ "mark"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-offset": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last search offset.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-redo-function": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Function to be used by 'evil-redo'.\nCustomized via `evil-undo-system'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-refresh-mode-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Refresh mode line tag.",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-skip-empty-lines": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil of the current insertion should not take place on\n lines at which the insertion point is behind the end of the\n line.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-leader": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set KEY to trigger leader bindings in STATE.\nKEY should be in the form produced by `kbd'. STATE is one of\n`normal', `insert', `visual', `replace', `operator', `motion',\n`emacs', a list of one or more of these, or `nil', which means\nall of the above. If LOCALLEADER is non-nil, set the local leader\ninstead.",
+ "arglist": [
+ "state",
+ "key",
+ "&optional",
+ "localleader"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-bottom": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to line COUNT from the bottom of the window.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-pop": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Replace the just repeated command with a previously executed command.\nOnly allowed after `evil-repeat', `evil-repeat-pop' or\n`evil-repeat-pop-next'. Uses the same repeat count that\nwas used for the first repeat.\n\nThe COUNT argument inserts the COUNT-th previous kill.\nIf COUNT is negative, this is a more recent kill.",
+ "arglist": [
+ "count",
+ "&optional",
+ "save-point"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-pos": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The position of point at the beginning of an change-tracking\n editing command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normalize-position": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return POS if it does not exceed the buffer boundaries.\nIf POS is less than `point-min', return `point-min'.\nIs POS is more than `point-max', return `point-max'.\nIf POS is a marker, return its position.",
+ "arglist": [
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-split-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Splits window and switches to another buffer.",
+ "arglist": [
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-window": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the `selected-window' to SIDE.\nThe state of the `selected-window' is saved along with the state\nof the window tree consisting of all the other windows. Then, all\nwindows are deleted, the remaining window is split according to\nSIDE, the state of the window at SIDE is replaced with the saved\nstate of the `selected-window', and, finally, the state of the\nsaved window tree is reconstructed on the opposite side.\n\nSIDE has the same meaning as in `split-window'.\n\nNote, this function only operates on the window tree rooted in\nthe frame's main window and effectively preserves any side\nwindows (i.e. windows with a valid window-side window\nparameter).",
+ "arglist": [
+ "side"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-bottom-line-to-top": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the line right below the window,\nor line COUNT to the top of the window.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-temporary-undo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "When undo is disabled in current buffer.\nCertain commands depending on undo use this variable\ninstead of `buffer-undo-list'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-copy": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Copy lines in BEG END below line given by ADDRESS.",
+ "arglist": [
+ "beg",
+ "end",
+ "address"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-declare-not-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Declare COMMAND to be nonrepeatable.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-delete": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The Ex delete command.\n[BEG,END]delete [REGISTER] [COUNT]",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register",
+ "count",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-cjk-word-combining-categories": {
+ "default": "((nil . 94) (94) (114 . 107) (114 . 65) (114 . 71) (107 . 114) (107 . 65) (107 . 71) (65 . 114) (65 . 107) (65 . 71) (71 . 114) (71 . 107) (71 . 65))",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "List of pair (cons) of categories to determine word boundary\nused in `evil-cjk-word-boundary-p'. See the documentation of\n`word-combining-categories'. Use `describe-categories' to see the\nlist of categories.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-end-and-return-macro": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Like `kmacro-end-macro' but also return the macro.\nRemove \\<evil-insert-state-map>\\[evil-execute-in-normal-state] from the end.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-install-or-uninstall": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-keymap-prompt": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the prompt-string of MAP to PROMPT.",
+ "arglist": [
+ "map",
+ "prompt"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-add-command-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Add PROPERTIES to COMMAND.\nPROPERTIES should be a property list.\nTo replace all properties at once, use `evil-set-command-properties'.",
+ "arglist": [
+ "command",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-middle": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the middle line in the window.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set RANGE to have beginning BEG and end END.\nThe TYPE and additional PROPERTIES may also be specified.\nIf an argument is nil, it's not used; the previous value is retained.\nSee also `evil-set-range-beginning', `evil-set-range-end',\n`evil-set-range-type' and `evil-set-range-properties'.",
+ "arglist": [
+ "range",
+ "&optional",
+ "beg",
+ "end",
+ "type",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-modes": {
+ "default": "(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)",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Modes that should come up in Motion state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-full-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for a full search pattern PATTERN-STRING in DIRECTION.\nThis function split PATTERN-STRING in\npattern/offset/;next-pattern parts and performs the search in\nDIRECTION which must be either 'forward or 'backward. The first\nsearch is repeated COUNT times. If the pattern part of\nPATTERN-STRING is empty, the last global pattern stored in\n`evil-ex-search-pattern' is used instead if in addition the\noffset part is nil (i.e. no pattern/offset separator), the last\nglobal offset stored in `evil-ex-search-offset' is used as\noffset. The current match data will correspond to the last\nsuccessful match. This function returns a triple (RESULT PATTERN\nOFFSET) where RESULT is\n\n t the search has been successful without wrap\n 'wrap the search has been successful with wrap\n 'empty-pattern the last pattern has been empty\n nil the search has not been successful\n\nand PATTERN and OFFSET are the last pattern and offset this\nfunction searched for. Note that this function does not handle\nany error conditions.",
+ "arglist": [
+ "pattern-string",
+ "count",
+ "direction"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-local-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Operator-Pending state is enabled.\nUse the command `evil-operator-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Mode line tag for Operator-Pending state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inclusive-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return size of inclusive from BEG to END with PROPERTIES.\n\nInclude the character under point.\nIf the end position is at the beginning of a line or the end of a\nline and `evil-want-visual-char-semi-exclusive', then:\n\n* If in visual state return `exclusive' (expanded).",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Insert state is enabled.\nUse the command `evil-insert-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-buffer-regexps": {
+ "default": "((\"^ \\\\*load\\\\*\"))",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Regular expressions determining the initial state for a buffer.\nEntries have the form (REGEXP . STATE), where REGEXP is a regular\nexpression matching the buffer's name and STATE is one of `normal',\n`insert', `visual', `replace', `operator', `motion', `emacs' and\n`nil'. If STATE is `nil', Evil is disabled in the buffer.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-describe": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return description of BEG and END with PROPERTIES.\nIf no description is available, return the empty string.",
+ "arglist": [
+ "beg",
+ "end",
+ "type",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-top-line-to-bottom": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the line right below the window,\nor line COUNT to the top of the window.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-current-replacement": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The actual replacement.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-symbol-1": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-symbol-1'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-without-restriction": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY with the top-most narrowing removed.\nThis works only if the previous narrowing has been generated by\n`evil-with-restriction'.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-visual-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the type of the Visual selection.\nIf SELECTION is specified, return the type of that instead.",
+ "arglist": [
+ "&optional",
+ "selection"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-first-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the line number of the first line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-split-prev-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Splits window and goes to the COUNT-th prev buffer in the buffer list.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-max-length": {
+ "default": 100,
+ "local": null,
+ "default-type": "integer",
+ "var-docstring": "The maximum number of jumps to keep track of.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-stop-execute-in-emacs-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-word-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the end of the COUNT-th next word.\nIf BIGWORD is non-nil, move by WORDS.",
+ "arglist": [
+ "&optional",
+ "count",
+ "bigword"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-start-record-changes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Starts the recording of a new set of buffer changes.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-line'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-ex-execute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute RESULT as an ex command in the appropriate buffer.",
+ "arglist": [
+ "result"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-send-localleader": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Put symbol localleader in `unread-command-events' to trigger any\n<localleader> bindings.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-exchange-point-and-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Exchange point and mark without activating the region.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-command-window": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Start command window with search history and current minibuffer content.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-with-single-undo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY as a single undo step.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-commands": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-vsplit": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Splits the current window vertically, COUNT columns width,\nediting a certain FILE. The new window will be created to the\nright when `evil-vsplit-window-right' is non-nil. If COUNT and\n`evil-auto-balance-windows'are both non-nil then all children\nof the parent of the splitted window are rebalanced.",
+ "arglist": [
+ "&optional",
+ "count",
+ "file"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the type of OBJECT, or DEFAULT if none.",
+ "arglist": [
+ "object",
+ "&optional",
+ "default"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-subrange-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether RANGE1 is contained within RANGE2.",
+ "arglist": [
+ "range1",
+ "range2"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct-idx": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Access slot \"idx\" of `evil-jumps-struct' struct CL-X.",
+ "arglist": [
+ "cl-x"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-key": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create a STATE binding from KEY to DEF for KEYMAP.\nSTATE is one of `normal', `insert', `visual', `replace',\n`operator', `motion', `emacs', or a list of one or more of\nthese. Omitting a state by using `nil' corresponds to a standard\nEmacs binding using `define-key'. The remaining arguments are\nlike those of `define-key'. For example:\n\n (evil-define-key 'normal foo-map \"a\" 'bar)\n\nThis creates a binding from `a' to `bar' in normal state, which\nis active whenever `foo-map' is active. Using nil for the state,\nthe following lead to identical bindings:\n\n (evil-define-key nil foo-map \"a\" 'bar)\n (define-key foo-map \"a\" 'bar)\n\nIt is possible to specify multiple states and/or bindings at\nonce:\n\n (evil-define-key '(normal visual) foo-map\n \"a\" 'bar\n \"b\" 'foo)\n\nIf `foo-map' has not been initialized yet, this macro adds an\nentry to `after-load-functions', delaying execution as necessary.\n\nKEYMAP may also be a quoted symbol. If the symbol is `global', the\nglobal evil keymap corresponding to the state(s) is used, meaning\nthe following lead to identical bindings:\n\n (evil-define-key 'normal 'global \"a\" 'bar)\n (evil-global-set-key 'normal \"a\" 'bar)\n\nThe symbol `local' may also be used, which corresponds to using\n`evil-local-set-key'. If a quoted symbol is used that is not\n`global' or `local', it is assumed to be the name of a minor\nmode, in which case `evil-define-minor-mode-key' is used.",
+ "arglist": [
+ "state",
+ "keymap",
+ "key",
+ "def",
+ "&rest",
+ "bindings"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-local-mode-major-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-refresh": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Refresh point, mark and Visual variables.\nRefreshes `evil-visual-beginning', `evil-visual-end',\n`evil-visual-mark', `evil-visual-point', `evil-visual-selection',\n`evil-visual-direction', `evil-visual-properties' and `evil-this-type'.",
+ "arglist": [
+ "&optional",
+ "mark",
+ "point",
+ "type",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-top-left": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to top-left window.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-state-entry-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when entering Motion state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to [count] previous lowercase mark.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--restore-repeat-hooks": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "No insert-state repeat info is recorded after executing in normal state.\nRestore the disabled repeat hooks on insert-state exit.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-toggle-key": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set `evil-toggle-key' to KEY.\nKEY must be readable by `read-kbd-macro'.",
+ "arglist": [
+ "key"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-change": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change text from BEG to END with TYPE.\nSave in REGISTER or the kill-ring with YANK-HANDLER.\nDELETE-FUNC is a function for deleting text, default `evil-delete'.\nIf TYPE is `line', insertion starts on an empty line.\nIf TYPE is `block', the inserted text in inserted at each line\nof the block.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register",
+ "yank-handler",
+ "delete-func"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-modes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--find-thing": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a cons of THING near point as a string and its position.\nTHING should be a symbol understood by `thing-at-point',\ne.g. 'symbol or 'word. If FORWARD is nil, search backward,\notherwise forward. Returns nil if nothing is found.",
+ "arglist": [
+ "forward",
+ "thing"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-initial-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the Evil state to use for MODE or its alias.\nReturns DEFAULT if no initial state is associated with MODE.\nThe initial state for a mode can be set with\n`evil-set-initial-state'.\n\nIf FOLLOW-PARENT is non-nil, also check parent modes of MODE and\nits alias. CHECKED-MODES is used internally and should not be set\ninitially.",
+ "arglist": [
+ "mode",
+ "&optional",
+ "default",
+ "follow-parent",
+ "checked-modes"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-recording-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns non-nil iff a recording is in progress.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-active-region": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Toggle active region.\nEnsure that Transient Mark mode is properly enabled.\nEnable with positive ARG, disable with negative ARG.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-delete": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Deletes the current window.\nIf `evil-auto-balance-windows' is non-nil then all children of\nthe deleted window's parent window are rebalanced.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-page-down": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window COUNT pages downwards.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-range-beginning": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return beginning of RANGE.",
+ "arglist": [
+ "range"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ensure-column": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY so that column after execution is correct.\nIf `evil-start-of-line' is nil, treat BODY as if it were a `next-line' command.\nThis mostly copies the approach of Emacs' `line-move-1', but is modified\nso it is more compatible with evil's notions of eol & tracking.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-narrow": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restrict the buffer to BEG and END.\nBEG or END may be nil, specifying a one-sided restriction including\n`point-min' or `point-max'. See also `evil-with-restriction.'",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-cjk-word-separating-categories": {
+ "default": "((67 . 72) (67 . 75) (67 . 107) (67 . 65) (67 . 71) (72 . 67) (72 . 75) (72 . 107) (72 . 65) (72 . 71) (75 . 67) (75 . 72) (75 . 107) (75 . 65) (75 . 71) (107 . 67) (107 . 72) (107 . 75) (65 . 67) (65 . 72) (65 . 75) (71 . 67) (71 . 72) (71 . 75))",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "List of pair (cons) of categories to determine word boundary\nused in `evil-cjk-word-boundary-p'. See the documentation of\n`word-separating-categories'. Use `describe-categories' to see\nthe list of categories.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-execute-macro": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute keyboard macro MACRO, COUNT times.\nWhen called with a non-numerical prefix (such as \\[universal-argument]),\nCOUNT is infinite. MACRO is read from a register\nwhen called interactively.",
+ "arglist": [
+ "count",
+ "macro"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-bindings": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Evil's bindings for insert & replace states.\nUsed in `evil-insert-state-map' and `evil-replace-state-map',\nexcluding <delete>, <escape>, and `evil-toggle-key'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-for-keymap": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the minor mode associated with KEYMAP.\nReturns DEFAULT if no mode is found.\nSee also `evil-keymap-for-mode'.",
+ "arglist": [
+ "keymap",
+ "&optional",
+ "default"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-shell-argument-initialized": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "This variable is set to t if shell command completion has been initialized.\nSee `evil-ex-init-shell-argument-completion'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-record-position": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set `evil-repeat-pos' to POS or point.",
+ "arglist": [
+ "&optional",
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeats the last ex command.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--flyspell-overlay-at": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "pos",
+ "forwardp"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-pending-custom-initialize": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "A list of pending initializations for custom variables.\nEach element is a triple (FUNC VAR VALUE). When Evil is\ncompletely loaded then the functions (funcall FUNC VAR VALUE) is\ncalled for each element. FUNC should be a function suitable for\nthe :initialize property of `defcustom'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-read-motion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Read a MOTION, motion COUNT and motion TYPE from the keyboard.\nThe type may be overridden with MODIFIER, which may be a type\nor a Visual selection as defined by `evil-define-visual-selection'.\nReturn a list (MOTION COUNT [TYPE]).",
+ "arglist": [
+ "&optional",
+ "motion",
+ "count",
+ "type",
+ "modifier"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-argument-handler-completer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "arg-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-prev-flyspell-error": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to the COUNT'th spelling mistake preceding point.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-tag": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Mode line tag for Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-next": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Goes to the next occurrence.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-overriding-keymap-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether MAP is an overriding keymap for STATE.\nIf STATE is nil, it means any state.",
+ "arglist": [
+ "map",
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-pre-jump-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run just before jumping to a location in the jump list.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-block": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "*Blockwise selection.",
+ "fn-docstring": "Blockwise selection.",
+ "arglist": [
+ "&optional",
+ "mark",
+ "point",
+ "type",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-alternate-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the last buffer WINDOW has displayed other than the\ncurrent one (equivalent to Vim's alternate buffer).\n\nReturns the first item in `window-prev-buffers' that isn't\n`window-buffer' of WINDOW.",
+ "arglist": [
+ "&optional",
+ "window"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-with-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change to STATE and execute BODY without refreshing the display.\nRestore the previous state afterwards.",
+ "arglist": [
+ "state",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-write-echo-area": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If set to t inside `evil-save-echo-area', then the echo area\nis not restored.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-command-window-execute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "config",
+ "result"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-left": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window COUNT half-screenwidths to the left.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-transform-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Apply TRANSFORM to RANGE according to its type.\nReturn a new range if COPY is non-nil.",
+ "arglist": [
+ "transform",
+ "range",
+ "&optional",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat the last editing command with count replaced by COUNT.\nIf SAVE-POINT is non-nil, do not move point.",
+ "arglist": [
+ "count",
+ "&optional",
+ "save-point"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-repeat-substitute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat last substitute command.\nThis is the same as :s//~/",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "flags"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-vars": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-keypress-parser": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Read from keyboard or INPUT and build a command description.\nReturns (CMD COUNT), where COUNT is the numeric prefix argument.\nBoth COUNT and CMD may be nil.",
+ "arglist": [
+ "&optional",
+ "input"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-state-entry-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when entering Visual state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-global": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The Ex global command.\n[BEG,END]global[!]/PATTERN/COMMAND",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "pattern",
+ "command",
+ "invert"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-normal": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The Ex normal command.\nExecute the argument as normal command on each line in the\nrange. The given argument is passed straight to\n`execute-kbd-macro'. The default is the current line.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "commands"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state-properties": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Specifications made by `evil-define-state'.\nEntries have the form (STATE . PLIST), where PLIST is a property\nlist specifying various aspects of the state. To access a property,\nuse `evil-state-property'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ret-and-indent": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT lines down.\nIf point is on a widget or a button, click on it.\nIn Insert state, insert a newline and indent.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-section-begin": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the beginning of the COUNT-th next section.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-mark": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set buffer's mark to POS.\nIf POS is nil, delete the mark.",
+ "arglist": [
+ "pos"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-redo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Undo COUNT changes in buffer using `evil-redo-function'.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-echo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Display an unlogged message in the echo area.\nThat is, the message is not logged in the *Messages* buffer.\n(To log the message, just use `message'.)",
+ "arglist": [
+ "string",
+ "&rest",
+ "args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-beyond-eol": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether the cursor can move past the end of the line.\nIf non-nil, the cursor is allowed to move one character past the\nend of the line, as in Emacs.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hook run after entering or leaving `evil-mode'.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-down": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window and the cursor COUNT lines downwards.\nIf COUNT is not specified the function scrolls down\n`evil-scroll-count', which is the last used count.\nIf the scroll count is zero the command scrolls half the screen.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-bounds-of-not-thing-at-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns the bounds of a complement of THING at point.\nIf there is a THING at point nil is returned. Otherwise if WHICH\nis nil or 0 a cons cell (BEG . END) is returned. If WHICH is\nnegative the beginning is returned. If WHICH is positive the END\nis returned.",
+ "arglist": [
+ "thing",
+ "&optional",
+ "which"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state-overriding-keymaps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a keymap alist of overriding keymaps for STATE.",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-read-digraph-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Read two keys from keyboard forming a digraph.\nThis function creates an overlay at (point), hiding the next\nHIDE-CHARS characters. HIDE-CHARS defaults to 1.",
+ "arglist": [
+ "&optional",
+ "hide-chars"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-completion-table-concat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "table1",
+ "table2",
+ "string",
+ "pred",
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-find-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeat the last find COUNT times.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change the cursor's apperance according to SPECS.\nSPECS may be a cursor type as per `cursor-type', a color\nstring as passed to `set-cursor-color', a zero-argument\nfunction for changing the cursor, or a list of the above.",
+ "arglist": [
+ "specs"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-undo-list-pointer": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Everything up to this mark is united in the undo-list.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-angle": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner angle bracket.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-sentence-begin": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the next COUNT-th beginning of a sentence or end of a paragraph.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Goes to the `count'-th next buffer in the buffer list.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paste-from-register": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Paste from REGISTER.",
+ "arglist": [
+ "register"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-make-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create a new search pattern.\nREGEXP is the regular expression to be searched for. CASE should\nbe either 'sensitive, 'insensitive for case-sensitive and\ncase-insensitive search, respectively, or anything else. In the\nlatter case the pattern is smart-case, i.e. it is automatically\nsensitive of the pattern contains one upper case letter,\notherwise it is insensitive. The input REGEXP is considered a\nVim-style regular expression if `evil-ex-search-vim-style-regexp'\nis non-nil, in which case it is transformed to an Emacs style\nregular expression (i.e. certain backslash-codes are\ntransformed. Otherwise REGEXP must be an Emacs style regular\nexpression and is not transformed.",
+ "arglist": [
+ "regexp",
+ "case",
+ "whole-line"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-block-contract": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform contract transformation on block from BEG to END with PROPERTIES.\n\nLike `inclusive', but for rectangles:\nthe last column is included.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-previous-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The previously executed Ex command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-match-beg": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The beginning position of the last match.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normalize": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Normalize BEG and END as TYPE with PROPERTIES.\nReturns a list (BEG END TYPE PROPERTIES ...), where the tail\nmay contain a property list.",
+ "arglist": [
+ "beg",
+ "end",
+ "type",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-indent": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Indent text.",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-vcount": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The information about the number of following lines the\ninsertion should be repeated. This is list (LINE COLUMN COUNT)\nwhere LINE is the line-number where the original insertion\nstarted and COLUMN is either a number or function determining the\ncolumn where the repeated insertions should take place. COUNT is\nnumber of repeats (including the original insertion).",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-track-last-insertion": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Track the last insertion range and its text.\nThe insertion range is stored as a pair of buffer positions in\n`evil-current-insertion'. If a subsequent change is compatible,\nthen the current range is modified, otherwise it is replaced by a\nnew range. Compatible changes are changes that do not create a\ndisjoin range.",
+ "arglist": [
+ "beg",
+ "end",
+ "len"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-flyspell-error": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to the COUNT'th spelling mistake after point.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-find-char-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the previous COUNT'th occurrence of CHAR.",
+ "arglist": [
+ "&optional",
+ "count",
+ "char"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode-map-alist": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Association list of keymaps to use for Evil modes.\nElements have the form (MODE . KEYMAP), with the first keymaps\nhaving higher priority.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete text from BEG to END with TYPE.\nSave in REGISTER or in the kill-ring with YANK-HANDLER.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-exclusive-string": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return size of exclusive from BEG to END with PROPERTIES.\n\nReturn the positions unchanged, with some exceptions.\nIf the end position is at the beginning of a line, then:\n\n* If the beginning position is at or before the first non-blank\n character on the line, return `line' (expanded).\n\n* Otherwise, move the end position to the end of the previous\n line and return `inclusive' (expanded).",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--execute-normal-eol-pos": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Vim has special behaviour for executing in normal state at eol.\nThis var stores the eol position, so it can be restored when necessary.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Cursor for Operator-Pending state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-char-in-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-char-in-line'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to Insert state just before point.\nThe insertion will be repeated COUNT times and repeated once for\nthe next VCOUNT - 1 lines starting at the same column.\nIf SKIP-EMPTY-LINES is non-nil, the insertion will not be performed\non lines on which the insertion point would be after the end of the\nlines. This is the default behaviour for Visual-state insertion.",
+ "arglist": [
+ "count",
+ "&optional",
+ "vcount",
+ "skip-empty-lines"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-alist": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Association list of characters overwritten in Replace state.\nThe format is (POS . CHAR).",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-update-x-selection": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update the X selection with the current visual region of BUFFER.",
+ "arglist": [
+ "&optional",
+ "buffer"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-with-view-list": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Opens new list view buffer.\n\nPROPERTIES is a property-list which supports the following properties:\n\n:name (required) The name of the buffer.\n:mode-name (required) The name for the mode line.\n:format (required) The value for `tabulated-list-format'.\n:entries (required) The value for `tabulated-list-entries'.\n:select-action (optional) A function for row selection.\n It takes in a single parameter, which is the selected row's\n vector value that is passed into `:entries'.\n",
+ "arglist": [
+ "&rest",
+ "properties"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-ex-search-match-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The end position of the last match.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-last-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-C-d-scroll": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `C-d' scrolls down (like Vim).",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-move-very-top": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Closes the current window, splits the upper-left one horizontally\nand redisplays the current buffer there.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-indentation": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete all indentation on current line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "*Characterwise selection.",
+ "fn-docstring": "Characterwise selection.",
+ "arglist": [
+ "&optional",
+ "mark",
+ "point",
+ "type",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-selection-function": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a selection function for TYPE.\nDefault to `evil-visual-make-region'.",
+ "arglist": [
+ "selection"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-change-to-previous-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change the state of BUFFER to its previous state.",
+ "arglist": [
+ "&optional",
+ "buffer",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mouse-events-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Returns non-nil iff KEYS contains a mouse event.",
+ "arglist": [
+ "keys"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-input-method": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Input method used in Insert state and Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-state-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether the current state is Operator-Pending state.\n(That is, whether `evil-state' is `operator'.)",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-this-register": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Current register.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-find-file-at-point-with-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Opens the file at point and goes to line-number.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-execute-in-emacs-state-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The buffer of the latest `evil-execute-in-emacs-state'.\nWhen this command is being executed the current buffer is stored\nin this variable. This is necessary in case the Emacs-command to\nbe called changes the current buffer.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-word-begin": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the beginning of the COUNT-th previous word.\nIf BIGWORD is non-nil, move by WORDS.",
+ "arglist": [
+ "&optional",
+ "count",
+ "bigword"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-unbounded-word-forward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search forward for symbol under point.\nThe search is unbounded, i.e., the pattern is not wrapped in\n\\<...\\>.",
+ "arglist": [
+ "&optional",
+ "count",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-interactive": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If t search is interactive.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-state-local-map": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Buffer-local keymap for Normal state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-back-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner back-quoted expression.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-nreplaced": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jump-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to older position in jump list.\nTo go the other way, press \\<evil-motion-state-map>\\[evil-jump-forward].",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-=-register-input": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Most recent input from the `=' register. A string.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-custom-motions": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Sets the list of motion commands.",
+ "arglist": [
+ "var",
+ "values"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-minor-mode-keymap-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether MAP is a minor-mode keymap.",
+ "arglist": [
+ "map"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-normal-post-command": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Reset command loop variables in Normal state.\nAlso prevent point from reaching the end of the line.\nIf the region is activated, enter Visual state.",
+ "arglist": [
+ "&optional",
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-change-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Change to end of line, or change whole line if characterwise visual mode.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inclusive-contract": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform contract transformation on inclusive from BEG to END with PROPERTIES.\n\nInclude the character under point.\nIf the end position is at the beginning of a line or the end of a\nline and `evil-want-visual-char-semi-exclusive', then:\n\n* If in visual state return `exclusive' (expanded).",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-last-visual-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a linewise range of the last visual selection.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-list-view-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Major mode derived from `tabulated-list-mode' by `define-derived-mode'.\nIt inherits all of the parent's attributes, but has its own keymap,\nabbrev table and syntax table:\n\n `evil-list-view-mode-map', `evil-list-view-mode-abbrev-table' and\n`evil-list-view-mode-syntax-table'\n\nwhich more-or-less shadow tabulated-list-mode's corresponding tables.\n\nIn addition to any hooks its parent mode might have run, this mode\nruns the hook `evil-list-view-mode-hook', as the final or penultimate\nstep during initialization.\n\n\\{evil-list-view-mode-map}",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-find-char-to": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move before the next COUNT'th occurrence of CHAR.",
+ "arglist": [
+ "&optional",
+ "count",
+ "char"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-initial-input": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Additional initial content of the ex command line.\nThis content of this variable is appended to the ex command line\nif ex is started interactively.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-list-view-select-action": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-declare-change-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Declare COMMAND to be repeatable by buffer changes rather than\nkeystrokes.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-definition": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to definition or first occurrence of symbol under point.\nSee also `evil-goto-definition-functions'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-unbounded-word-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search backward for symbol under point.\nThe search is unbounded, i.e., the pattern is not wrapped in\n\\<...\\>.",
+ "arglist": [
+ "&optional",
+ "count",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-minor-mode-keymaps-alist": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Association list of Evil states to minor-mode keymap alists.\nEntries have the form (STATE . MODE-MAP-ALIST), where\nMODE-MAP-ALIST is an alist taking the form of\n`minor-mode-map-alist'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-middle-of-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the middle of the current visual line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-line-contract": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform contract transformation on line from BEG to END with PROPERTIES.\n\nInclude whole lines.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-beginning": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move backward to beginning of THING.\nThe motion is repeated COUNT times. This is the same as calling\n`evil-backward-beginning' with -COUNT.",
+ "arglist": [
+ "thing",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-add-hjkl-bindings": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Add \"h\", \"j\", \"k\", \"l\" bindings to KEYMAP in STATE.\nAdd additional BINDINGS if specified.",
+ "arglist": [
+ "keymap",
+ "&optional",
+ "state",
+ "&rest",
+ "bindings"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-command-window-execute-fn": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The command to execute when exiting the command line window.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-char-marker-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-WORD": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a WORD.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state-modes": {
+ "default": "(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)",
+ "local": null,
+ "default-type": "cons",
+ "var-docstring": "Modes that should come up in Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-set-min": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the minimal buffer position of the highlight HL to MIN.",
+ "arglist": [
+ "hl",
+ "min"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move COUNT - 1 lines down.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-change": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the regular expression of highlight NAME to PATTERN.",
+ "arglist": [
+ "name",
+ "pattern"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-syntax": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point to the end or beginning of a sequence of characters in\nSYNTAX.\nStop on reaching a character not in SYNTAX.",
+ "arglist": [
+ "syntax",
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-WORD": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-describe-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return description of RANGE.\nIf no description is available, return the empty string.",
+ "arglist": [
+ "range"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-whole-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete whole line.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-overlay": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The overlay for the current search result.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-track-eol": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-motion-state-map>\nWhether \\[evil-end-of-line] \"sticks\" the cursor to the end of the line.\nIf non-nil, vertical motions after \\[evil-end-of-line] maintain the cursor at the\nend of the line, even if the target line is longer. This is analogous\nto `track-eol', but respects Evil's interpretation of end-of-line.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-column": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to column COUNT on the current line.\nColumns are counted from zero.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-pattern-update-replacement": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Update the replacement display.",
+ "arglist": [
+ "_hl",
+ "overlay"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-command-force-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether COMMAND accepts the bang argument.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-file-or-shell-command-completion-at-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-esc-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Original ESC prefix map in `input-decode-map'.\nUsed by `evil-esc-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-line-position": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the position of LINE.\nIf COLUMN is specified, return its position on the line.\nA negative number means the end of the line.",
+ "arglist": [
+ "line",
+ "&optional",
+ "column"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-close-paren": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to [count] next unmatched ')'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-start-session": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Initialize Ex for interactive search.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-abort": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Abort current repeation.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-changes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Accumulated buffer changes for changed-based commands.",
+ "fn-docstring": "Repeation recording function for commands that are repeated by buffer changes.",
+ "arglist": [
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-regex": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-previous-point": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The position of point before Visual state, a marker.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-paste-before": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Pastes the latest yanked text before the cursor position.\nThe return value is the yanked text.",
+ "arglist": [
+ "count",
+ "&optional",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-markers-alist": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Association list for markers.\nEntries have the form (CHAR . DATA), where CHAR is the marker's\nname and DATA is either a marker object as returned by `make-marker',\na variable, a movement function, or a cons cell (STRING NUMBER),\nwhere STRING is a file path and NUMBER is a buffer position.\nThe global value of this variable holds markers available from\nevery buffer, while the buffer-local value holds markers available\nonly in the current buffer.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-property": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return property PROP for KEY in ALIST.\nALIST is an association list with entries of the form\n(KEY . PLIST), where PLIST is a property list.\nIf PROP is nil, return all properties for KEY.\nIf KEY is t, return an association list of keys\nand their PROP values.",
+ "arglist": [
+ "alist",
+ "key",
+ "&optional",
+ "prop"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-beginning-of-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the beginning of the current line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute-flags": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The last substitute flags.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-execute-in-normal-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute the next command in Normal state.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-savehist-load": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for window-related commands.",
+ "fn-docstring": "Prefix command (definition is a keymap associating keystrokes with commands).",
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "ffap-other-window": "C-f",
+ "evil-window-set-height": "C-_",
+ "evil-window-prev": "W",
+ "evil-window-next": "C-w",
+ "evil-window-vsplit": "C-v",
+ "evil-window-top-left": "C-t",
+ "evil-window-split": "C-s",
+ "evil-window-split": "C-s",
+ "evil-window-rotate-upwards": "R",
+ "evil-window-rotate-downwards": "C-r",
+ "evil-window-mru": "C-p",
+ "delete-other-windows": "C-o",
+ "evil-window-new": "C-n",
+ "evil-window-move-far-right": "L",
+ "evil-window-move-very-top": "K",
+ "evil-window-move-very-bottom": "J",
+ "evil-window-move-far-left": "H",
+ "evil-window-delete": "C-c",
+ "evil-window-bottom-right": "C-b",
+ "evil-window-set-width": "|",
+ "balance-windows": "=",
+ "evil-window-increase-width": ">",
+ "evil-window-decrease-width": "<",
+ "evil-window-set-height": "C-_",
+ "evil-window-decrease-height": "-",
+ "evil-window-increase-height": "+",
+ "evil-window-prev": "W",
+ "evil-window-next": "C-w",
+ "evil-window-vsplit": "C-v",
+ "evil-window-top-left": "C-t",
+ "evil-window-split": "C-s",
+ "evil-window-split": "C-s",
+ "evil-window-rotate-upwards": "R",
+ "evil-window-rotate-downwards": "C-r",
+ "evil-quit": "q",
+ "evil-window-mru": "C-p",
+ "delete-other-windows": "C-o",
+ "evil-window-new": "C-n",
+ "evil-window-move-far-right": "L",
+ "evil-window-right": "l",
+ "evil-window-move-very-top": "K",
+ "evil-window-up": "k",
+ "evil-window-move-very-bottom": "J",
+ "evil-window-down": "j",
+ "evil-window-move-far-left": "H",
+ "evil-window-left": "h",
+ "evil-window-delete": "C-c",
+ "evil-window-bottom-right": "C-b"
+ }
+ },
+ "evil-transform-vim-style-regexp": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Transforms vim-style backslash codes to Emacs regexp.\nThis includes the backslash codes \\d, \\D, \\s, \\S, \\x, \\X,\n\\o, \\O, \\a, \\A, \\l, \\L, \\u, \\U and \\w, \\W. The new\ncodes \\y and \\Y can be used instead of the Emacs code \\s and\n\\S which have a different meaning in Vim-style.",
+ "arglist": [
+ "regexp"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-split-search-pattern": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Split PATTERN in regexp, offset and next-pattern parts.\nReturns a triple (regexp offset next-search).",
+ "arglist": [
+ "pattern",
+ "direction"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-highlight-all": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "If t and interactive search is enabled, all matches are\nhighlighted.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-transient-vars": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "List of variables pertaining to Transient Mark mode.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-read-key-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap active during `evil-read-key'.\nThis keymap can be used to bind some commands during the\nexecution of `evil-read-key' which is usually used to read a\ncharacter argument for some commands, e.g. `evil-replace'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": {
+ "evil-read-digraph-char": "C-k",
+ "evil-read-quoted-char": "C-v",
+ "evil-read-quoted-char": "C-v",
+ "keyboard-quit": "C-g",
+ "keyboard-quit": "C-g",
+ "keyboard-quit": "C-g"
+ }
+ },
+ "evil-first-non-blank-of-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the first non blank character\nof the current screen line.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-line-up": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window COUNT lines upwards.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-lines": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if the current insertion command is a line-insertion\ncommand o or O.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jump-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "`pre-command-hook' for evil-jumps.\nSet jump point if COMMAND has a non-nil `:jump' property. Otherwise,\nsave the current position in case the command being executed will\nchange the current buffer.",
+ "arglist": [
+ "&optional",
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-this-command-keys": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Version of `this-command-keys' with finer control over prefix args.",
+ "arglist": [
+ "&optional",
+ "post-cmd"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-non-blank": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the last non-blank character of the current line.\nIf COUNT is given, move COUNT - 1 lines downward first.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-this-type": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Current motion type.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Keymap for Ex.\nKey sequences bound in this map are immediately executed.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-bracket": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a square bracket.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-was-yanked-without-register": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether text being saved to the numbered-register ring was\nnot deleted and not yanked to a specific register.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-section-begin": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the beginning of the COUNT-th previous section.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-has-command-property-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Whether COMMAND has Evil PROPERTY.\nSee also `evil-has-command-properties-p'.",
+ "arglist": [
+ "command",
+ "property"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-make-intercept-map": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Give KEYMAP precedence over all Evil keymaps in STATE.\nIf STATE is nil, give it precedence over all states. If AUX is non-nil, make the\nauxiliary keymap corresponding to KEYMAP in STATE an intercept keymap instead of\nKEYMAP itself. See also `evil-make-overriding-map'.",
+ "arglist": [
+ "keymap",
+ "&optional",
+ "state",
+ "aux"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-block-rotate": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Perform rotate transformation on block from BEG to END with PROPERTIES.\n\nRotate block according to :corner property.\n:corner can be one of `upper-left',``upper-right', `lower-left'\nand `lower-right'.\n\nLike `inclusive', but for rectangles:\nthe last column is included.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-word-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the end of the COUNT-th previous word.\nIf BIGWORD is non-nil, move by WORDS.",
+ "arglist": [
+ "&optional",
+ "count",
+ "bigword"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-parse-global": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Parse STRING as a global argument.",
+ "arglist": [
+ "string"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-initialize": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Evil in the current buffer, if appropriate.\nTo enable Evil globally, do (evil-mode 1).",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-first-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to line COUNT. By default the first line.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-hl-face": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the face of the highlight HL.",
+ "arglist": [
+ "hl"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-bang": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The \"!\" argument of the current Ex command.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-read-key": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Read a key from the keyboard.\nTranslates it according to the input method.",
+ "arglist": [
+ "&optional",
+ "prompt"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-yank": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The Ex yank command.\n[BEG,END]yank [REGISTER] [COUNT]",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register",
+ "count",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-symbol": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner symbol.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-expand-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Expand RANGE according to its type.\nReturn a new range if COPY is non-nil.",
+ "arglist": [
+ "range",
+ "&optional",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-line-down": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window COUNT lines downwards.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-cmd": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The current Ex command string.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-beginning-of-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the beginning of the line as displayed.\nLike `move-beginning-of-line', but retains the goal column.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-abort": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Abort interactive search, disabling lazy highlighting.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-mru": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the previous (last accessed) buffer in another window.\nMore precisely, it selects the most recently used buffer that is\nshown in some other window, preferably of the current frame, and\nis different from the current one.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-decrease-height": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Decrease current window height by COUNT.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-make-selection": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Create a Visual selection with point at POINT and mark at MARK.\nThe boundaries of the selection are inferred from these\nand the current TYPE. To specify the boundaries and infer\nmark and point, use `evil-visual-select' instead.",
+ "arglist": [
+ "mark",
+ "point",
+ "&optional",
+ "type",
+ "message"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-a-word": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select a word.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-new": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Splits the current window horizontally\nand opens a new buffer or edits a certain FILE.",
+ "arglist": [
+ "count",
+ "file"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save the current cursor; execute BODY; restore the cursor.",
+ "arglist": [
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-repeat-start-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Record a new repeat when exiting Normal state.\nDoes not record in Emacs state or if the current command\nhas :repeat nil.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-restriction-stack": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "List of previous restrictions.\nUsing `evil-with-restriction' stores the previous values of\n`point-min' and `point-max' as a pair in this list.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define type TYPE.\nDOC is a general description and shows up in all docstrings.\n\nOptional keyword arguments:\n- `:expand' - expansion function. This function should accept two\n positions in the current buffer, BEG and END,and return a pair of\n expanded buffer positions.\n- `:contract' - the opposite of `:expand'. Optional.\n- `:one-to-one' - non-nil if expansion is one-to-one. This means that\n `:expand' followed by `:contract' always return the original range.\n- `:normalize' - normalization function. This function should accept\n two unexpanded positions and adjust them before expansion. May be\n used to deal with buffer boundaries.\n- `:string' - description function. Takes two buffer positions and\n returns a human-readable string. For example \"2 lines\"\n\nIf further keywords and functions are specified, they are assumed to\nbe transformations on buffer positions, like `:expand' and `:contract'.\n\n(fn TYPE DOC [[KEY FUNC]...])",
+ "arglist": [
+ "type",
+ "doc",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-expand": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Expand BEG and END as TYPE with PROPERTIES.\nReturns a list (BEG END TYPE PROPERTIES ...), where the tail\nmay contain a property list.",
+ "arglist": [
+ "beg",
+ "end",
+ "type",
+ "&rest",
+ "properties"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-incrementally": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search incrementally for user-entered text.",
+ "arglist": [
+ "forward",
+ "regexp-p"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-setup-and-update": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Initialize Ex minibuffer with `evil-ex-setup', then call `evil-ex-update'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-defun": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-section-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the end of the COUNT-th previous section.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-yank": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Saves the characters in motion into the kill-ring.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register",
+ "yank-handler"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--insert-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Switch to insert state at the beginning of the current line.\nIf NON-BLANK-P is non-nil, point is placed at the first non-blank character\non the current line. If NON-BLANK-P is nil, point is placed at column 0,\nor the beginning of visual line. The insertion will be repeated COUNT times.\nIf VCOUNT is non nil it should be number > 0. The insertion will be repeated\nin the next VCOUNT - 1 lines below the current one.",
+ "arglist": [
+ "count",
+ "vcount",
+ "non-blank-p"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-put": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "beg",
+ "end",
+ "ex-arg",
+ "&optional",
+ "force"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-word-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search backward for symbol under point.",
+ "arglist": [
+ "&optional",
+ "count",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-next-close-brace": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to [count] next unmatched '}'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move cursor to the left by COUNT characters.\nMovement is restricted to the current line unless CROSSLINES is non-nil.\nIf NOERROR is non-nil, don't signal an error upon reaching the beginning\nof the line or the buffer; just return nil.",
+ "arglist": [
+ "&optional",
+ "count",
+ "crosslines",
+ "noerror"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inner-single-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Select inner single-quoted expression.",
+ "arglist": [
+ "&optional",
+ "count",
+ "beg",
+ "end",
+ "type"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-prev-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-window-next": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor to the next window in the cyclic order.\nWith COUNT go to the count-th window in the order starting from\ntop-left.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-inhibit-operator": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Inhibit current operator.\nIf an operator calls a motion and the motion sets this variable\nto t, the operator code is not executed.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-C-w-delete": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether `C-w' deletes a word in Insert state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ac-prefix-len": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-end": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The end of the Visual selection, a marker.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-word": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for word near point.\nIf FORWARD is nil, search backward, otherwise forward. If SYMBOL\nis non-nil then the functions searches for the symbol at point,\notherwise for the word at point.",
+ "arglist": [
+ "forward",
+ "unbounded",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Evil mode is enabled.\nSee the `evil-mode' command\nfor a description of this minor mode.\nSetting this variable directly does not take effect;\neither customize it (see the info node `Easy Customization')\nor call the function `evil-mode'.",
+ "fn-docstring": "Toggle Evil-Local mode in all buffers.\nWith prefix ARG, enable Evil mode if ARG is positive; otherwise,\ndisable it.\n\nIf called from Lisp, toggle the mode if ARG is `toggle'.\nEnable the mode if ARG is nil, omitted, or is a positive number.\nDisable the mode if ARG is a negative number.\n\nEvil-Local mode is enabled in all buffers where `evil-initialize'\nwould do it.\n\nSee `evil-local-mode' for more information on Evil-Local mode.\n\nThis function has :around advice: ‘ad-Advice-evil-mode’.\n\n(fn &optional ARG)",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct-p--cmacro": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "compiler-macro for inlining `evil-jumps-struct-p'.",
+ "arglist": [
+ "_cl-whole-arg",
+ "cl-x"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-local-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Evil-Local mode is enabled.\nUse the command `evil-local-mode' to change this variable.",
+ "fn-docstring": "Minor mode for setting up Evil in a single buffer.\n\nThis is a minor mode. If called interactively, toggle the\n`Evil-Local mode' mode. If the prefix argument is positive,\nenable the mode, and if it is zero or negative, disable the mode.\n\nIf called from Lisp, toggle the mode if ARG is `toggle'. Enable\nthe mode if ARG is nil, omitted, or is a positive number.\nDisable the mode if ARG is a negative number.\n\nTo check whether the minor mode is enabled in the current buffer,\nevaluate `evil-local-mode'.\n\nThe mode's hook is called both when the mode is enabled and when\nit is disabled.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-regex-without-case": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the regular expression without all occurrences of \\c and \\C.",
+ "arglist": [
+ "re"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-and-quit": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save all buffers and exit Emacs.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-with-restriction": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Execute BODY with the buffer narrowed to BEG and END.\nBEG or END may be nil as passed to `evil-narrow'; this creates\na one-sided restriction.",
+ "arglist": [
+ "beg",
+ "end",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-normal-state-exit-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when exiting Normal state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-case": {
+ "default": "smart",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The case behaviour of the search command.\nSmart case means that the pattern is case sensitive if and only\nif it contains an upper case letter, otherwise it is case\ninsensitive.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-echo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Display a message after the current Ex command.",
+ "arglist": [
+ "string",
+ "&rest",
+ "args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-adjust-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move point one character back if at the end of a non-empty line.\nThis behavior is controled by `evil-move-beyond-eol'.",
+ "arglist": [
+ "&optional",
+ "_"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-transform-magic": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Transforms STR with magic characters.\nMAGIC is a regexp that matches all potential magic\ncharacters. Each occurence of CHAR as magic character within str\nis replaced by the result of calling the associated TRANSFORM\nfunction. TRANSFORM is a function taking two arguments, the\ncharacter to be transformed and the rest of string after the\ncharacter. The function should return a triple (REPLACEMENT REST\n. STOP) where REPLACEMENT is the replacement and REST is the rest\nof the string that has not been transformed. If STOP is non-nil\nthen the substitution stops immediately. The replacement starts\nat position START, everything before that position is returned\nliterally. The result is a pair (RESULT . REST). RESULT is a\nlist containing the transformed parts in order. If two\nsubsequents parts are both strings, they are concatenated. REST\nis the untransformed rest string (usually \"\" but may be more if\nTRANSFORM stopped the substitution). Which characters are\nconsidered as magic characters (i.e. the transformation happens\nif the character is NOT preceeded by a backslash) is determined\nby `evil-magic'. The special tokens \\v, \\V, \\m and \\M have\nalways a special meaning (like in Vim) and should not be\ncontained in TRANSFORMS, otherwise their meaning is overwritten.\n\nThe parameter QUOTE is a quoting function applied to literal\ntransformations, usually `regexp-quote' or `replace-quote'.",
+ "arglist": [
+ "str",
+ "magic",
+ "quote",
+ "transform",
+ "&optional",
+ "_start"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-indent-convert-tabs": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-normal-state-map>\nIf non-nil, the \\[evil-indent] operator converts between leading tabs and spaces.\nWhether tabs are converted to spaces or vice versa depends on the\nvalue of `indent-tabs-mode'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for STRING and highlight matches.\nIf FORWARD is nil, search backward, otherwise forward.\nIf REGEXP-P is non-nil, STRING is taken to be a regular expression.\nSTART is the position to search from; if unspecified, it is\none more than the current position.",
+ "arglist": [
+ "string",
+ "forward",
+ "&optional",
+ "regexp-p",
+ "start"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-digraph": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Insert COUNT digraphs.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-want-fine-undo": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether actions are undone in several steps.\nThere are two possible choices: nil (\"no\") means that all\nchanges made during insert state, including a possible delete\nafter a change operation, are collected in a single undo step.\nNon-nil (\"yes\") means that undo steps are determined according\nto Emacs heuristics, and no attempt is made to aggregate changes.\n\nFor backward compatibility purposes, the value `fine' is\ninterpreted as `nil'. This option was removed because it did not\nwork consistently.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-ex": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open a command line window for editing and executing ex commands.\nIf CURRENT-COMMAND is present, it will be inserted under the\ncursor as the current command to be edited. If EXECUTE-FN is given,\nit will be used as the function to execute instead of\n`evil-command-window-ex-execute', the default.",
+ "arglist": [
+ "&optional",
+ "current-command",
+ "execute-fn"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-auxiliary-keymap": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the auxiliary keymap for MAP in STATE to AUX.\nIf AUX is nil, create a new auxiliary keymap.",
+ "arglist": [
+ "map",
+ "state",
+ "&optional",
+ "aux"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Open a command line window for HIST with CMD-KEY and EXECUTE-FN.\nHIST should be a list of commands. CMD-KEY should be the string of\nthe key whose history is being shown (one of \":\", \"/\", or\n\"?\"). EXECUTE-FN should be a function of one argument to\nexecute on the result that the user selects.",
+ "arglist": [
+ "hist",
+ "cmd-key",
+ "execute-fn"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct-idx--cmacro": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "compiler-macro for inlining `evil-jumps-struct-idx'.",
+ "arglist": [
+ "_cl-whole-arg",
+ "cl-x"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-minor-mode": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if Emacs state is enabled.\nUse the command `evil-emacs-state' to change this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-sentence-begin": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the previous COUNT-th beginning of a sentence or paragraph.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-start-of-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Analogue of vim's `startofline'.\nIf nil, preserve column when making relevant movements of the cursor.\nOtherwise, move the cursor to the start of the line.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jump-handle-buffer-crossing": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-function": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a search function.\nIf FORWARD is nil, search backward, otherwise forward.\nIf REGEXP-P is non-nil, the input is a regular expression.\nIf WRAP is non-nil, the search wraps around the top or bottom\nof the buffer.\nIf PREDICATE is non-nil, it must be a function accepting two\narguments: the bounds of a match, returning non-nil if that match is\nacceptable.",
+ "arglist": [
+ "&optional",
+ "forward",
+ "regexp-p",
+ "wrap",
+ "predicate"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search forward or backward COUNT times for the current ex search pattern.\nThe search pattern is determined by `evil-ex-search-pattern' and\nthe direcion is determined by `evil-ex-search-direction'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ace-jump-char-to-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Jump visually to the char in front of a char using ace-jump.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-window-configuration-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": [
+ "&rest",
+ "_args"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state-entry-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when entering Emacs state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-jumps-struct-previous-pos--cmacro": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "compiler-macro for inlining `evil-jumps-struct-previous-pos'.",
+ "arglist": [
+ "_cl-whole-arg",
+ "cl-x"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-match": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Find COUNTth next match in DIRECTION.",
+ "arglist": [
+ "direction",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-declare-insert-at-point-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Declare COMMAND to be repeatable by buffer changes.",
+ "arglist": [
+ "command"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-substitute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "The Ex substitute command.\n[BEG,END]substitute/PATTERN/REPLACEMENT/FLAGS",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "pattern",
+ "replacement",
+ "flags"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Replace text from BEG to END with CHAR.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "char"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-exit-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hooks to run when exiting Replace state.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-show-files": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Shows the file-list.\nThe same as `buffer-menu', but shows only buffers visiting\nfiles.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-range-type": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set RANGE's type to TYPE.\nIf COPY is non-nil, return a copy of RANGE.",
+ "arglist": [
+ "range",
+ "type",
+ "&optional",
+ "copy"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-last-repeat": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Information about the latest repeat command.\nThis is a list of three elements (POINT COUNT UNDO-POINTER),\nwhere POINT is the position of point before the latest repeat,\nCOUNT the count-argument of the latest repeat command and\nUNDO-POINTER the head of the undo-list before the last command\nhas been repeated.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-get-command-property": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return the value of Evil PROPERTY of COMMAND.\nIf the command does not have the property, return DEFAULT.\nSee also `evil-get-command-properties'.",
+ "arglist": [
+ "command",
+ "property",
+ "&optional",
+ "default"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-save-transient-mark-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Save Transient Mark mode and make it buffer-local.\nAny changes to Transient Mark mode are now local to the current\nbuffer, until `evil-restore-transient-mark-mode' is called.\n\nVariables pertaining to Transient Mark mode are listed in\n`evil-transient-vars', and their values are stored in\n`evil-transient-vals'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-deinit-esc": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restore `input-decode-map' in terminal.",
+ "arglist": [
+ "frame"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-error": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to error number COUNT.\n\nIf no COUNT supplied, move to the current error.\n\nActs like `first-error' other than when given no counts, goes\nto the current error instead of the first, like in Vim's :cc\ncommand.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-end-of-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the end of the line as displayed.\nLike `move-end-of-line', but retains the goal column.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-wrap": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-motion-state-map>\nWhether search with \\[evil-search-forward] and \\[evil-search-backward] wraps around the buffer.\nIf this is non-nil, search stops at the buffer boundaries.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--add-to-alist": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Add the assocation of KEY and VAL to the value of LIST-VAR.\nIf the list already contains an entry for KEY, update that entry;\notherwise add at the end of the list.\n\n(fn LIST-VAR KEY VAL &rest ELEMENTS)",
+ "arglist": [
+ "list-var",
+ "&rest",
+ "elements"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-cleanup-insert-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Called when Insert state is about to be exited.\nHandles the repeat-count of the insertion command.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--mode-p": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Determines whether any symbol in MODES represents the current\nbuffer's major mode or any of its minors.",
+ "arglist": [
+ "modes"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-full-range": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a range encompassing the whole buffer.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-direction": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Whether point follows mark in Visual state.\nNegative if point precedes mark, otherwise positive.\nSee also the function `evil-visual-direction'.",
+ "fn-docstring": "Return direction of Visual selection.\nThe direction is -1 if point precedes mark and 1 otherwise.\nSee also the variable `evil-visual-direction', which holds\nthe direction of the last selection.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-search-module": {
+ "default": "isearch",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The search module to be used. May be either `isearch', for\nEmacs' isearch module, or `evil-search', for Evil's own\ninteractive search module. N.b. changing this will not affect keybindings.\nTo swap out relevant keybindings, see `evil-select-search-module' function.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-mode-hook": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Hook run after entering Evil-cmd mode.\nNo problems result if this variable is not bound.\n`add-hook' automatically binds it. (This is true for all hook variables.)",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil--jumps-debug": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-get-optional-register-and-count": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Parse STRING as an ex arg with both optional REGISTER and COUNT.\nReturns a list (REGISTER COUNT).",
+ "arglist": [
+ "string"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-scroll-column-right": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Scrolls the window COUNT columns to the right.",
+ "arglist": [
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-set-initial-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Set the initial state for major mode MODE to STATE.\nThis is the state the buffer comes up in.",
+ "arglist": [
+ "mode",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-command-completion-at-point": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-echo-area-message": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Previous value of `current-message'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-stop-session": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Stop interactive search.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-kbd-macro-suppress-motion-error": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "\\<evil-motion-state-map>\nWhether left/right motions signal errors in keyboard macros.\nThis variable only affects beginning-of-line or end-of-line errors\nregarding the motions \\[evil-backward-char] and \\[evil-forward-char]\nrespectively. This may be desired since such errors cause macro\ndefinition or execution to be terminated. There are four\npossibilities:\n\n- `record': errors are suppressed when recording macros, but not when\n replaying them.\n- `replay': errors are suppressed when replaying macros, but not when\n recording them.\n- `t': errors are suppressed in both cases.\n- `nil': errors are never suppressed.",
+ "fn-docstring": "Returns non-nil if a motion error should be suppressed.\nWhether the motion error should be suppressed depends on the\nvariable `evil-kbd-macro-suppress-motion-error'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-keystrokes": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Repeation recording function for commands that are repeated by keystrokes.",
+ "arglist": [
+ "flag"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-state-intercept-keymaps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a keymap alist of intercept keymaps for STATE.",
+ "arglist": [
+ "&optional",
+ "state"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-command-window-search-execute": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for RESULT using FORWARD to determine direction.",
+ "arglist": [
+ "result",
+ "forward"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-list-view-quit": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": null,
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-eolp": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Like `eolp' but accounts for `evil-move-beyond-eol' being nil.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-visual-selection": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "The kind of Visual selection.\nThis is a selection as defined by `evil-define-visual-selection'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-line-or-visual-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move COUNT - 1 lines down.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-state-alist": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "For Each evil state the Evil state being switched from.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-operator-range-end": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "End of `evil-operator-range'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-last-was-search": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Non-nil if the previous was a search.\nOtherwise the previous command is assumed as substitute.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-align-center": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Centers lines in the region between WIDTH columns.\nThe default for width is the value of `fill-column'.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "width"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-this-macro": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Current macro register.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-fill": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Fill text.",
+ "arglist": [
+ "beg",
+ "end"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-previous-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move the cursor COUNT lines up.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-char-2-below": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-char-2-below'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-current-buffer": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "The buffer from which Ex was started.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-forward-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move cursor to the right by COUNT characters.\nMovement is restricted to the current line unless CROSSLINES is non-nil.\nIf NOERROR is non-nil, don't signal an error upon reaching the end\nof the line or the buffer; just return nil.",
+ "arglist": [
+ "&optional",
+ "count",
+ "crosslines",
+ "noerror"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-pending-overriding-maps": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "An alist of pending overriding maps.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-fold-list": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Actions to be performed for various folding operations.\n\nThe value should be a list of fold handlers, were a fold handler has\nthe format:\n\n ((MODES) PROPERTIES)\n\nMODES acts as a predicate, containing the symbols of all major or\nminor modes for which the handler should match. For example:\n\n '((outline-minor-mode org-mode) ...)\n\nwould match for either outline-minor-mode or org-mode, even though the\nformer is a minor mode and the latter is a major.\n\nPROPERTIES specifies possible folding actions and the functions to be\napplied in the event of a match on one (or more) of the MODES; the\nsupported properties are:\n\n - `:open-all'\n Open all folds.\n - `:close-all'\n Close all folds.\n - `:toggle'\n Toggle the display of the fold at point.\n - `:open'\n Open the fold at point.\n - `:open-rec'\n Open the fold at point recursively.\n - `:close'\n Close the fold at point.\n\nEach value must be a function. A value of `nil' will cause the action\nto be ignored for that respective handler. For example:\n\n `((org-mode)\n :close-all nil\n :open ,(lambda ()\n (show-entry)\n (show-children))\n :close hide-subtree)\n\nwould ignore `:close-all' actions and invoke the provided functions on\n`:open' or `:close'.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delimited-arguments": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Parse STRING as a sequence of delimited arguments.\nReturns a list of NUM strings, or as many arguments as\nthe string contains. The first non-blank character is\ntaken to be the delimiter. If some arguments are missing\nfrom STRING, the resulting list is padded with nil values.\nTwo delimiters following directly after each other gives\nan empty string.",
+ "arglist": [
+ "string",
+ "&optional",
+ "num"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-backward-paragraph": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the beginning of the COUNT-th previous paragraph.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-compile-subreplacement": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Convert a regexp replacement TO to Lisp from START until \\e or \\E.\nReturns a pair (RESULT . REST). RESULT is a list suitable for\n`perform-replace' if necessary, the original string if not.\nREST is the unparsed remainder of TO.",
+ "arglist": [
+ "to",
+ "&optional",
+ "start"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-commands": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Association list of command bindings and functions.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-define-visual-selection": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Define a Visual selection SELECTION.\nCreates a command evil-visual-SELECTION for enabling the selection.\nDOC is the function's documentation string. The following keywords\nmay be specified in BODY:\n\n:message STRING Status message when enabling the selection.\n:type TYPE Type to use (defaults to SELECTION).\n\nFollowing the keywords is optional code which is executed each time\nthe selection is enabled.\n\n(fn SELECTION DOC [[KEY VAL]...] BODY...)",
+ "arglist": [
+ "selection",
+ "doc",
+ "&rest",
+ "body"
+ ],
+ "functionp": null,
+ "macrop": true,
+ "keymap-inv": null
+ },
+ "evil-avy-goto-symbol-1-above": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Evil motion for `avy-goto-symbol-1-above'.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-no-display": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "If non-nil, various Evil displays are inhibited.\nUse the macro `evil-without-display' to set this variable.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-activate-input-method": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable input method in states with :input-method non-nil.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-select-quote": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a range (BEG END) of COUNT quoted text objects.\nQUOTE specifies the quotation delimiter. BEG END TYPE are the\ncurrently selected (visual) range.\n\nIf INCLUSIVE is nil the previous selection is ignore. If there is\nquoted string at point this object will be selected, otherwise\nthe following (if (> COUNT 0)) or preceeding object (if (< COUNT\n0)) is selected. If (/= (abs COUNT) 2) the delimiting quotes are not\ncontained in the range, otherwise they are contained in the range.\n\nIf INCLUSIVE is non-nil the selection depends on the previous\nselection. If the currently selection contains at least one\ncharacter that is contained in a quoted string then the selection\nis extended, otherwise it is thrown away. If there is a\nnon-selected object at point then this object is added to the\nselection. Otherwise the selection is extended to the\nfollowing (if (> COUNT 0)) or preceeding object (if (< COUNT\n0)). Any whitespace following (or preceeding if (< COUNT 0)) the\nnew selection is added to the selection. If no such whitespace\nexists and the selection contains only one quoted string then the\npreceeding (or following) whitespace is added to the range. ",
+ "arglist": [
+ "quote",
+ "beg",
+ "end",
+ "type",
+ "count",
+ "&optional",
+ "inclusive"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-find-thing": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a THING near point as a string.\nTHING should be a symbol understood by `thing-at-point',\ne.g. 'symbol or 'word. If FORWARD is nil, search backward,\notherwise forward. Returns nil if nothing is found.",
+ "arglist": [
+ "forward",
+ "thing"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-motion-marker": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Marker for storing the starting position of a motion.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-shift-width": {
+ "default": 4,
+ "local": true,
+ "default-type": "integer",
+ "var-docstring": "\\<evil-normal-state-map>\nThe number of columns by which a line is shifted.\nThis applies to the shifting operators \\[evil-shift-right] and \\[evil-shift-left].",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-goto-line": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Go to line COUNT. By default the last line.",
+ "arglist": [
+ "&optional",
+ "count"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-delete-hl": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Remove the highlighting object with a certain NAME.",
+ "arglist": [
+ "name"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-search-unbounded-word-backward": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Search for the next occurrence of word under the cursor.",
+ "arglist": [
+ "&optional",
+ "count",
+ "symbol"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-repeat-find-to-skip-next": {
+ "default": "t",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Whether a repeat of t or T should skip an adjacent character.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-restore-transient-mark-mode": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Restore Transient Mark mode.\nThis presupposes that `evil-save-transient-mark-mode' has been\ncalled earlier. If Transient Mark mode was disabled before but\nenabled in the meantime, this function disables it; if it was\nenabled before but disabled in the meantime, this function\nenables it.\n\nThe earlier settings of Transient Mark mode are stored in\n`evil-transient-vals'.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-signed-number": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Return a signed number like -3 and +1.\nNUMBER defaults to 1.",
+ "arglist": [
+ "sign",
+ "&optional",
+ "number"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-emacs-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Emacs state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-mouse-drag-track": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Track mouse drags by highlighting area between point and cursor.\nThe region will be defined with mark and point.\nDO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by\n`mouse-drag-region'.",
+ "arglist": [
+ "start-event",
+ "&optional",
+ "do-mouse-drag-region-post-process"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-signal-at-eob": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Signals 'end-of-buffer if `point' is at eob.\nThis function should be used in forward motions. If `point' is close\nto eob so that no further forward motion is possible the error\n'end-of-buffer is raised. This is the case if `point' is at\n`point-max' or if is one position before `point-max',\n`evil-move-beyond-eol' is nil and `point' is not at the end\nof a line. The latter is necessary because `point' cannot be\nmoved to `point-max' if `evil-move-beyond-eol' is nil and\nthe last line in the buffer is not empty.",
+ "arglist": null,
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-state": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Enable Insert state. Disable with negative ARG.\nIf ARG is nil, don't display a message in the echo area.",
+ "arglist": [
+ "&optional",
+ "arg"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-move-beginning": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Move to the beginning of the COUNT next object.\nIf COUNT is negative, move to the COUNT previous object.\nFORWARD is a function which moves to the end of the object, and\nBACKWARD is a function which moves to the beginning.\nIf one is unspecified, the other is used with a negative argument.",
+ "arglist": [
+ "count",
+ "forward",
+ "&optional",
+ "backward"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-insert-repeat-info": {
+ "default": "nil",
+ "local": true,
+ "default-type": "symbol",
+ "var-docstring": "Repeat information accumulated during an insertion.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-replace-state-cursor": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "Cursor for Replace state.\nMay be a cursor type as per `cursor-type', a color string as passed\nto `set-cursor-color', a zero-argument function for changing the\ncursor, or a list of the above.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-delete-char": {
+ "default": "nil",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": null,
+ "fn-docstring": "Delete next character.",
+ "arglist": [
+ "beg",
+ "end",
+ "&optional",
+ "type",
+ "register"
+ ],
+ "functionp": true,
+ "macrop": null,
+ "keymap-inv": null
+ },
+ "evil-ex-complete-emacs-commands": {
+ "default": "in-turn",
+ "local": null,
+ "default-type": "symbol",
+ "var-docstring": "TAB-completion for Emacs commands in ex command line.\nThis variable determines when Emacs commands are considered for\ncompletion, always, never, or only if no Evil ex command is\navailable for completion.",
+ "fn-docstring": null,
+ "arglist": true,
+ "functionp": null,
+ "macrop": null,
+ "keymap-inv": null
+ }
+} \ No newline at end of file
diff --git a/elpa/evil-1.15.0/doc/front.png b/elpa/evil-1.15.0/doc/front.png
new file mode 100644
index 0000000..f79a67e
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/front.png
Binary files differ
diff --git a/elpa/evil-1.15.0/doc/logo.png b/elpa/evil-1.15.0/doc/logo.png
new file mode 100644
index 0000000..842a49d
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/logo.png
Binary files differ
diff --git a/elpa/evil-1.15.0/doc/logo.svg b/elpa/evil-1.15.0/doc/logo.svg
new file mode 100644
index 0000000..ff833c2
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/logo.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="127.82534"
+ height="62.426407"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ sodipodi:docname="evil.svg"
+ inkscape:export-filename="/home/vegard/evil.png"
+ inkscape:export-xdpi="150"
+ inkscape:export-ydpi="150">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.2069466"
+ inkscape:cx="173.13654"
+ inkscape:cy="12.652914"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1680"
+ inkscape:window-height="998"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ fit-margin-left="10"
+ fit-margin-top="10"
+ fit-margin-right="10"
+ fit-margin-bottom="10"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-165.00893,-164.53963)">
+ <rect
+ style="fill:#000000"
+ id="rect2991"
+ width="30.809652"
+ height="42.426407"
+ x="175.00893"
+ y="174.53963" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
+ x="178.15302"
+ y="209.50504"
+ id="text2985"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan2987"
+ x="178.15302"
+ y="209.50504"
+ style="font-weight:bold;letter-spacing:5.28999996px;-inkscape-font-specification:Ubuntu Bold"><tspan
+ style="letter-spacing:6.60000228999999994px;fill:#ffffff"
+ id="tspan2989">E</tspan><tspan
+ style="fill:#333333"
+ id="tspan2995">VIL</tspan></tspan></text>
+ <g
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Ubuntu;-inkscape-font-specification:Ubuntu"
+ id="text2997"
+ transform="matrix(0.89694705,0.44213798,-0.44213798,0.89694705,260.2961,-122.4502)">
+ <path
+ d="m 144.8919,272.13985 c 0.57684,-0.24621 1.4908,-0.78829 1.94103,-1.23149 0.46429,-0.46428 0.81251,-0.98134 1.04466,-1.55116 0.23214,-0.5698 0.33721,-0.99165 0.33722,-1.62479 0.0155,-0.43449 -0.28674,-1.22826 -0.57298,-1.8313 -0.26496,-0.55821 -0.52007,-1.02571 -0.52007,-1.02571 l -1.99277,2.29588 0.22983,-5.91917 5.5976,0.45081 -2.34283,1.96492 c 0,0 0.49752,1.04212 0.73633,1.68916 0.23881,0.64704 0.58739,1.34614 0.66973,2.19566 0.0366,0.62546 -0.16181,1.70241 -0.4854,2.4903 -0.33767,0.79493 -0.81956,1.50544 -1.44564,2.13152 -0.59093,0.58389 -1.53465,1.17717 -2.35067,1.54297"
+ style="fill:#333333"
+ id="path3002"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccscsccccczcccc" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="309.28571"
+ y="111.6479"
+ id="text3011"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3013"
+ x="309.28571"
+ y="111.6479" /></text>
+ </g>
+</svg>
diff --git a/elpa/evil-1.15.0/doc/make.bat b/elpa/evil-1.15.0/doc/make.bat
new file mode 100644
index 0000000..6247f7e
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/make.bat
@@ -0,0 +1,35 @@
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+)
+set SOURCEDIR=source
+set BUILDDIR=build
+
+if "%1" == "" goto help
+
+%SPHINXBUILD% >NUL 2>NUL
+if errorlevel 9009 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+)
+
+%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+goto end
+
+:help
+%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+:end
+popd
diff --git a/elpa/evil-1.15.0/doc/source/_ext/elisp.py b/elpa/evil-1.15.0/doc/source/_ext/elisp.py
new file mode 100644
index 0000000..924d026
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/_ext/elisp.py
@@ -0,0 +1,309 @@
+import re
+from os import path
+import json
+
+from docutils import nodes
+from docutils.parsers.rst import Directive
+
+from sphinx import addnodes
+from sphinx.domains import Domain, ObjType, Index
+from sphinx.domains.std import StandardDomain
+from sphinx.directives import ObjectDescription
+from sphinx.roles import XRefRole
+from sphinx.util.docfields import Field
+from sphinx.util.nodes import make_refnode
+
+
+with open(path.join(path.dirname(__file__), '..', '..', 'docstringdb.json')) as f:
+ DATA = json.load(f)
+
+
+re_evilcode = re.compile(r"`(evil-[^']*)'")
+re_code = re.compile(r"`([^:][^ ']*)'")
+re_kwd = re.compile(r"`(:[^']*)'")
+re_item = re.compile(r"([^\n])\n- ")
+re_sexp = re.compile(r"\([A-Z \-\.'`\[\]]+\)|[A-Z\-]+")
+re_capitals = re.compile(r"[A-Z\-]+")
+re_nonspace = re.compile(r"[^ ]")
+re_signature = re.compile(r'\(fn (.*)\)')
+re_keymap_or_kbd = re.compile(r"\\[\[<]([^\]>]*)[\]>]")
+
+emphasis = [
+ 'thing-at-point',
+]
+
+def emacs_is_local(var):
+ return DATA[var]['local']
+
+def emacs_default_value(var):
+ default = DATA[var]['default']
+ tp = DATA[var]['default-type']
+ if tp == 'string':
+ rep = repr(default)[1:-1]
+ return f'"{rep}"'
+ return str(default)
+
+def process_docstring(docstring, capitals=None):
+ # Remove explicit signature
+ docstring = re_signature.sub('', docstring)
+
+ # Add code blocks to indented sections
+ def blockified_lines(lines):
+ in_block = False
+ for line in lines:
+ try:
+ indented = next(re_nonspace.finditer(line)).start(0) > 3
+ except StopIteration:
+ indented = None
+ if indented is True and not in_block:
+ yield '.. code-block:: elisp'
+ yield ''
+ in_block = True
+ elif indented is False:
+ in_block = False
+ yield line
+ docstring = '\n'.join(blockified_lines(docstring.split('\n')))
+
+ # Substitute `evil-alpha' with :elisp:ref:`evil-alpha`
+ docstring = re_evilcode.sub(r':elisp:ref:`\1`', docstring)
+
+ # Substitute `alpha' with ``alpha``
+ docstring = re_code.sub(r'``\1``', docstring)
+
+ # Substitute `:alpha' with ``alpha``
+ docstring = re_kwd.sub(r'``\1``', docstring)
+
+ # Translate key bindings
+ keymap = None
+ def substitute_binding(match):
+ nonlocal keymap
+ if match.group(0)[1] == '<':
+ keymap = match.group(1)
+ return ''
+ if keymap is None:
+ print(docstring)
+ assert False
+ return '???'
+ key = DATA[keymap]['keymap-inv'][match.group(1)]
+ return f':kbd:`{key}`'
+ docstring = re_keymap_or_kbd.sub(substitute_binding, docstring)
+
+ # Add empty line between list items
+ docstring = re_item.sub(r'\1\n\n- ', docstring)
+
+ if capitals is None:
+ capitals = []
+ else:
+ capitals = list(capitals)
+
+ # Find things that look like sexps
+ def substitute_sexp(match):
+ s = match.group(0)
+ if re_capitals.match(s):
+ if s in capitals:
+ return f'*{s}*'
+ return s
+ else:
+ capitals.extend(re_capitals.findall(s))
+ return f'``{s}``'
+ docstring = re_sexp.sub(substitute_sexp, docstring)
+
+ # Italicize some words
+ for s in emphasis:
+ docstring = docstring.replace(s, f'*{s}*')
+
+ return docstring
+
+def emacs_variable_docstring(var):
+ docstring = DATA[var]['var-docstring']
+ return process_docstring(docstring)
+
+def emacs_function_docstring(var):
+ docstring = DATA[var]['fn-docstring']
+ return process_docstring(docstring, capitals=emacs_argnames(var))
+
+def emacs_argnames(var):
+ arglist = emacs_arglist(var)
+ return re_capitals.findall(arglist)
+
+def emacs_arglist(var):
+ docstring = DATA[var]['fn-docstring']
+ match = re_signature.search(docstring)
+ if match:
+ return match.group(1)
+
+ arglist = [arg.upper() for arg in DATA[var]['arglist']]
+ state = None
+ ret = ''
+ for arg in arglist:
+ if arg in ('&REST', '&OPTIONAL'):
+ if state == '&OPTIONAL':
+ ret += ']'
+ state = arg
+ ret += ' ['
+ continue
+ ret += ('' if state in ('&REST', '&OPTIONAL') else ' ') + arg
+ if state == '&OPTIONAL':
+ state += '-CONT'
+ if state is not None and state.startswith('&OPTIONAL'):
+ ret += ']'
+ if state == '&REST':
+ ret += '...]'
+ return ret
+
+
+class AbstractElisp(ObjectDescription):
+
+ def add_target_and_index(self, name, sig, signode):
+ anchor = f'elispobj-{sig}'
+ signode['ids'].append(anchor)
+
+ objs = self.env.domaindata['elisp']['objects']
+ objs[sig] = {
+ 'docname': self.env.docname,
+ 'anchor': f'elispobj-{sig}',
+ 'type': self.object_type,
+ }
+
+
+class AbstractVariable(AbstractElisp):
+ object_type = 'variable'
+
+ def handle_signature(self, sig, signode):
+ signode += addnodes.desc_annotation(sig, sig)
+ return sig
+
+ def run(self):
+ extra = []
+
+ default = self.default_value()
+ if default:
+ extra.append(f'Default: ``{default}``')
+ if self.is_buffer_local():
+ extra.append('buffer-local')
+
+ self.content.data.extend(['', ', '.join(extra)])
+ retval = super().run()
+ return retval
+
+
+class Variable(AbstractVariable):
+ required_arguments = 1
+ optional_arguments = 2
+
+ def default_value(self):
+ try:
+ return self.arguments[1]
+ except IndexError:
+ return None
+
+ def is_buffer_local(self):
+ return 'bufloc' in self.arguments[1:]
+
+
+class AutoVariable(AbstractVariable):
+ required_arguments = 1
+
+ def is_buffer_local(self):
+ return emacs_is_local(self.arguments[0])
+
+ def default_value(self):
+ return emacs_default_value(self.arguments[0])
+
+ def run(self):
+ docstring = emacs_variable_docstring(self.arguments[0])
+ self.content.data.extend(docstring.split('\n'))
+ return super().run()
+
+
+class AutoFunction(AbstractElisp):
+ required_arguments = 1
+
+ @property
+ def object_type(self):
+ return 'macro' if DATA[self.arguments[0]]['macrop'] else 'function'
+
+ def handle_signature(self, sig, signode):
+ args = emacs_arglist(sig)
+ signode += addnodes.desc_annotation(sig, f'({sig} {args})')
+ return sig
+
+ def run(self):
+ docstring = emacs_function_docstring(self.arguments[0])
+ self.content.data.extend(docstring.split('\n'))
+ return super().run()
+
+
+class ElispIndex(Index):
+ name = 'index'
+ localname = 'Emacs lisp functions and variables'
+ shortname = 'Elisp'
+
+ def generate(self, docnames=None):
+ index = {}
+ for name, item in self.domain.data['objects'].items():
+ if name.startswith('evil-'):
+ letter = name[5].upper()
+ else:
+ letter = name[0].upper()
+ index.setdefault(letter, []).append((
+ name,
+ 0,
+ item['docname'],
+ item['anchor'],
+ item['type'],
+ '',
+ '',
+ ))
+
+ index = {k: sorted(v, key=lambda k: k[0].lower()) for k, v in index.items()}
+ index = list(index.items())
+ index = sorted(index, key=lambda k: k[0])
+ return index, True
+
+
+class Elisp(Domain):
+ name = 'elisp'
+ label = 'Emacs lisp'
+
+ object_types = {
+ 'variable': ObjType('variable', 'variable', 'obj'),
+ 'autovariable': ObjType('autovariable', 'autovariable', 'obj'),
+ 'autofunction': ObjType('autofunction', 'autofunction', 'obj'),
+ }
+
+ directives = {
+ 'variable': Variable,
+ 'autovariable': AutoVariable,
+ 'autofunction': AutoFunction,
+ }
+
+ roles = {
+ 'ref': XRefRole(),
+ }
+
+ initial_data = {
+ 'objects': {},
+ }
+
+ indices = {
+ ElispIndex,
+ }
+
+ def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode):
+ obj = self.data['objects'].get(target, None)
+ if obj is None:
+ return None
+ return make_refnode(builder, fromdocname, obj['docname'], obj['anchor'], contnode, obj['anchor'])
+
+
+def setup(app):
+ app.add_domain(Elisp)
+ StandardDomain.initial_data['labels']['elispindex'] = ('elisp-index', '', 'Emacs lisp functions and variables')
+ StandardDomain.initial_data['anonlabels']['elispindex'] = ('elisp-index', '')
+
+ return {
+ 'version': '0.1',
+ 'parallel_read_safe': True,
+ 'parallel_write_safe': True,
+ }
diff --git a/elpa/evil-1.15.0/doc/source/conf.py b/elpa/evil-1.15.0/doc/source/conf.py
new file mode 100644
index 0000000..8e5f4ae
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/conf.py
@@ -0,0 +1,90 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Path setup --------------------------------------------------------------
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#
+# import os
+# import sys
+#
+
+import os, sys
+sys.path.append(os.path.abspath("./_ext"))
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'Evil'
+copyright = '2011-2019, Eivind Fonn, Frank Fischer, Vegard Øye'
+author = 'Eivind Fonn, Frank Fischer, Vegard Øye'
+
+# The full version, including alpha/beta/rc tags
+release = '1.15.0'
+
+master_doc = 'index'
+
+
+latex_elements = {
+ 'fontpkg': r'\usepackage{palatino} \usepackage{inconsolata}',
+ 'maketitle': r"""
+ \newcommand\sphinxbackoftitlepage{{
+ Copyright {copyright}.
+
+ \begin{{quote}}
+ 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''.
+ \end{{quote}}
+
+ The Evil team thanks everyone at gmane.emacs.vim-emulation for
+ their feedback and contributions.
+ }}
+ \sphinxmaketitle
+ """.format(copyright=copyright),
+}
+
+
+texinfo_documents = [
+ (master_doc, 'evil', 'Evil documentation', author, 'evil',
+ 'Extensible vi layer for Emacs', 'Emacs'),
+]
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ 'elisp',
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = []
+
+
+# -- Options for HTML output -------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+html_theme = 'sphinx_rtd_theme'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
diff --git a/elpa/evil-1.15.0/doc/source/extension.rst b/elpa/evil-1.15.0/doc/source/extension.rst
new file mode 100644
index 0000000..9cae483
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/extension.rst
@@ -0,0 +1,146 @@
+Extension
+=========
+
+The main functionality of Evil is implemented in terms of reusable
+macros. Package writers can use these to define new commands.
+
+
+Motions
+-------
+
+A *motion* is a command which moves the cursor, such as :kbd:`w` or
+:kbd:`e`. Motions are defined with the macro
+:elisp:ref:`evil-define-motion`. Motions not defined in this way
+should be declared with :elisp:ref:`evil-declare-motion`.
+
+.. elisp:autofunction:: evil-declare-motion
+
+.. elisp:autofunction:: evil-define-motion
+
+For example, this is a motion that moves the cursor forward by a
+number of characters:
+
+.. code-block:: elisp
+
+ (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.
+
+
+Operators
+---------
+
+An operator is a command that acts on the text moved over by a motion,
+such as :kbd:`c` (change), :kbd:`d` (delete) or :kbd:`y` (yank or
+copy, not to be confused with "yank" in Emacs terminology which means
+*paste*).
+
+.. elisp:autofunction:: evil-define-operator
+
+For example, this is an operator that performs ROT13 encryption on the
+text under consideration:
+
+.. code-block:: elisp
+
+ (evil-define-operator evil-rot13 (beg end)
+ "ROT13 encrypt text."
+ (rot13-region beg end))
+
+Binding this to :kbd:`g?` (where it is by default) will cause a key
+sequence such as :kbd:`g?w` to encrypt from the current cursor to the
+end of the word.
+
+
+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 :kbd:`i` and :kbd:`a`
+respectively.
+
+.. elisp:autofunction:: evil-define-text-object
+
+For eample, this is a text object which selects the next three
+characters after the current location:
+
+.. code-block:: elisp
+
+ (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`` [#thing]_ which moves past a
+ number of *things*.
+
+.. elisp:autofunction:: evil-select-inner-object
+
+.. elisp:autofunction:: evil-select-an-object
+
+.. elisp:autofunction:: evil-select-paren
+
+
+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*.
+
+.. elisp:autofunction:: evil-define-type
+
+
+States
+------
+
+States are defined with the macro :elisp:ref:`evil-define-state`,
+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.
+
+.. elisp:autofunction:: evil-define-state
+
+For example:
+
+.. code-block:: elisp
+
+ (evil-define-state test
+ "Test state."
+ :tag " <T> "
+ (message (if (evil-test-state-p)
+ "Enabling test state."
+ "Disabling test state.")))
+
+
+.. rubric:: Footnotes
+
+.. [#thing] 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.
diff --git a/elpa/evil-1.15.0/doc/source/faq.rst b/elpa/evil-1.15.0/doc/source/faq.rst
new file mode 100644
index 0000000..d389df0
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/faq.rst
@@ -0,0 +1,118 @@
+Frequently Asked Questions
+==========================
+
+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
+:kbd:`M-<key>` instead of two separate keys: :kbd:`ESC` followed by
+:kbd:`<key>`. In fact, it is perfectly valid to simulate
+:kbd:`M-<key>` by pressing :kbd:`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 :kbd:`ESC` and the second the key pressed simultaneously. The
+problem is that pressing the escape key itself also generates the
+:kbd:`ESC` event. Thus, if Emacs (and therefore Evil) receives an
+:kbd:`ESC` event there is no way to tell whether the escape key has
+been pressed (and no further event will arrive) or a :kbd:`M-<key>`
+combination has been pressed (and the :kbd:`<key>` event will arrive
+soon). In order to distinguish both situations Evil does the
+following. After receiving an :kbd:`ESC` event Evil waits for a short
+time period (specified by the variable :elisp:ref:`evil-esc-delay`
+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 :kbd:`M-<key>` combination has been pressed and
+combines the :kbd:`ESC` event with the second one. Because a
+:kbd:`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 :kbd:`M-<key>` sequences and often introduce their
+own delay for the :kbd:`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 :kbd:`M-<key>` combination has
+been pressed. But this also implies that pressing :kbd:`ESC` followed
+by <key> cannot be used to simulate :kbd:`M-<key>` in graphical mode!
+
+
+Underscore is not a word character
+----------------------------------
+
+An underscore ``_`` is a word character in Vim. This means that word
+motions like :kbd:`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 would be satisfied by having the :kbd:`*` and :kbd:`#` searches
+use symbols instead of words, this can be achieved by setting the
+:elisp:ref:`evil-symbol-word-search` variable to ``t``.
+
+If you want the underscore to be recognised as word character for other
+motions, you can modify its entry in the syntax-table:
+
+.. code-block:: elisp
+
+ (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.:
+
+.. code-block:: elisp
+
+ (add-hook 'c-mode-common-hook
+ (lambda () (modify-syntax-entry ?_ "w")))
+
+This gives the underscore the word syntax-class in all C-like buffers.
+
+Similarly to Emacs' definition of a word, the definition of a "symbol" is also
+dependent on the syntax-class of the buffer, which often includes the
+underscore. The default text objects keymap associates kbd::`o` with the symbol
+object, making kbd::`cio` a good alternative to Vim's kbd::`ciw`, for example.
+The following will swap between the word and symbol objects in the keymap:
+
+.. code-block:: elisp
+
+ (define-key evil-outer-text-objects-map "w" 'evil-a-symbol)
+ (define-key evil-inner-text-objects-map "w" 'evil-inner-symbol)
+ (define-key evil-outer-text-objects-map "o" 'evil-a-word)
+ (define-key evil-inner-text-objects-map "o" 'evil-inner-word)
+
+This will not change the motion keys, however. One way to make word motions
+operate as symbol motions is to alias the ``evil-word`` *thing* [#thingatpt]_ to
+the ``evil-symbol`` thing:
+
+.. code-block:: elisp
+
+ (defalias 'forward-evil-word 'forward-evil-symbol)
+
+
+.. rubric:: Footnotes
+
+.. [#thingatpt] 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.
diff --git a/elpa/evil-1.15.0/doc/source/hooks.rst b/elpa/evil-1.15.0/doc/source/hooks.rst
new file mode 100644
index 0000000..28ade72
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/hooks.rst
@@ -0,0 +1,16 @@
+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.
diff --git a/elpa/evil-1.15.0/doc/source/index.rst b/elpa/evil-1.15.0/doc/source/index.rst
new file mode 100644
index 0000000..95da7b7
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/index.rst
@@ -0,0 +1,21 @@
+.. Evil documentation master file, created by
+ sphinx-quickstart on Thu Dec 12 10:34:49 2019.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+Evil
+====
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents
+
+ overview
+ settings
+ keymaps
+ hooks
+ extension
+ faq
+ internals
+ license
+ indices
diff --git a/elpa/evil-1.15.0/doc/source/indices.rst b/elpa/evil-1.15.0/doc/source/indices.rst
new file mode 100644
index 0000000..46f687e
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/indices.rst
@@ -0,0 +1,6 @@
+.. only:: html
+
+ Index
+ =====
+
+ - :ref:`elispindex`
diff --git a/elpa/evil-1.15.0/doc/source/internals.rst b/elpa/evil-1.15.0/doc/source/internals.rst
new file mode 100644
index 0000000..9984f7c
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/internals.rst
@@ -0,0 +1,36 @@
+Internals
+=========
+
+Command properties
+------------------
+
+Evil defines *command properties* to store information about commands
+[#command]_, such as whether they should be repeated. A command
+property is a ``:keyword`` with an associated value, e.g.
+``:repeat nil``.
+
+.. elisp:autofunction:: evil-add-command-properties
+
+.. elisp:autofunction:: evil-set-command-properties
+
+.. elisp:autofunction:: evil-get-command-properties
+
+.. elisp:autofunction:: evil-get-command-property
+
+.. elisp:autofunction:: evil-define-command
+
+
+For setting repeat properties, use the following functions:
+
+.. elisp:autofunction:: evil-declare-repeat
+
+.. elisp:autofunction:: evil-declare-not-repeat
+
+.. elisp:autofunction:: evil-declare-change-repeat
+
+
+.. rubric:: Footnotes
+
+.. [#command] 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.
diff --git a/elpa/evil-1.15.0/doc/source/keymaps.rst b/elpa/evil-1.15.0/doc/source/keymaps.rst
new file mode 100644
index 0000000..36f8141
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/keymaps.rst
@@ -0,0 +1,145 @@
+.. _chapter-keymaps:
+
+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``:
+
+.. code-block:: elisp
+
+ (define-key evil-normal-state-map (kbd "w") 'some-function)
+
+This binds the key :kbd:`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.
+
+.. code-block:: elisp
+
+ (add-hook 'some-mode-hook
+ (lambda ()
+ (define-key evil-normal-state-local-map
+ (kbd "w") 'some-function)))
+
+For convenience, the functions :elisp:ref:`evil-global-set-key` and
+:elisp:ref:`evil-local-set-key` are available for setting global and
+local state keys.
+
+.. elisp:autofunction:: evil-global-set-key
+
+.. elisp:autofunction:: evil-local-set-key
+
+The above examples could therefore have been written as follows:
+
+.. code-block:: elisp
+
+ (evil-global-set-key 'normal (kbd "w") 'some-function)
+
+ (add-hook 'some-mode-hook
+ (lambda ()
+ (evil-local-set-key 'normal (kbd "w") 'some-function)))
+
+
+evil-define-key
+---------------
+
+Evil provides the macro :elisp:ref:`evil-define-key` 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.
+
+.. elisp:autofunction:: evil-define-key
+
+There follows a brief overview of the main functions of this macro.
+
+- Define a binding in a given state
+
+ .. code-block:: elisp
+
+ (evil-define-key 'state 'global (kbd "key") 'target)
+
+- Define a binding in a given state in the current buffer
+
+ .. code-block:: elisp
+
+ (evil-define-key 'state 'local (kbd "key") 'target)
+
+- Define a binding in a given state under the *foo-mode* major mode.
+
+ .. code-block:: elisp
+
+ (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.
+
+ .. code-block:: elisp
+
+ (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 :elisp:ref:`evil-define-key` 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 :kbd:`w` and
+:kbd:`e`:
+
+.. code-block:: elisp
+
+ (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:
+
+.. code-block:: elisp
+
+ (add-hook 'text-mode-hook 'foo-mode) ; enable alongside text-mode
+
+
+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.
+
+.. code-block:: elisp
+
+ (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 :elisp:ref:`evil-set-leader` to designate
+which key acts as the leader and the local leader.
+
+.. elisp:autofunction:: evil-set-leader
diff --git a/elpa/evil-1.15.0/doc/source/license.rst b/elpa/evil-1.15.0/doc/source/license.rst
new file mode 100644
index 0000000..39d6701
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/license.rst
@@ -0,0 +1,447 @@
+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.
diff --git a/elpa/evil-1.15.0/doc/source/overview.rst b/elpa/evil-1.15.0/doc/source/overview.rst
new file mode 100644
index 0000000..af91534
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/overview.rst
@@ -0,0 +1,117 @@
+Overview
+========
+
+Evil is an extensible vi layer for Emacs. It emulates the main
+features of Vim, [#vim]_ turning Emacs into a modal editor. Like Emacs in
+general, Evil is extensible in Emacs Lisp.
+
+
+Installation via package.el
+---------------------------
+
+Evil is available as a package from MELPA stable, MELPA unstable and
+NonGNU ELPA. This is the recommended way of installing Evil.
+
+To set up `package.el` to work with one of the MELPA repositories, you
+can follow the instructions on `melpa.org
+<https://melpa.org/#/getting-started>`_.
+
+Alternatively you can use NonGNU ELPA. It is part of the default
+package archives as of Emacs 28. For older Emacs versions you'll need
+to add it yourself:
+
+.. code-block:: elisp
+
+ (add-to-list 'package-archives
+ (cons "nongnu" (format "http%s://elpa.nongnu.org/nongnu/"
+ (if (gnutls-available-p) "s" ""))))
+
+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:
+
+.. code-block:: elisp
+
+ (require 'evil)
+ (evil-mode 1)
+
+
+Manual installation
+-------------------
+
+First, install `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:
+
+.. code-block:: elisp
+
+ (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.
+
+
+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 :kbd:`C-z`, which switches to an "Emacs state" (denoted by
+``<E>``) in which vi keys are completely disabled. Press :kbd:`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 :kbd:`C-z`, to re-enter
+ normal state.
+
+
+.. rubric:: Footnotes
+
+.. [#vim] 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>`_.
diff --git a/elpa/evil-1.15.0/doc/source/settings.rst b/elpa/evil-1.15.0/doc/source/settings.rst
new file mode 100644
index 0000000..125d7d6
--- /dev/null
+++ b/elpa/evil-1.15.0/doc/source/settings.rst
@@ -0,0 +1,195 @@
+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. [#order]_
+
+.. code-block:: elisp
+
+ (setq evil-shift-width 0)
+ ;; Load Evil
+ (require 'evil)
+
+What follows is a non-exhaustive list of the most relevant
+customization options.
+
+
+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
+:elisp:ref:`evil-set-initial-state`.
+
+.. elisp:autofunction:: evil-set-initial-state
+
+If no state can be found, Evil uses the default initial state.
+
+.. elisp:autovariable:: evil-default-state
+
+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.
+
+.. elisp:autovariable:: evil-buffer-regexps
+
+
+Keybindings and other behaviour
+-------------------------------
+
+Evil comes with a rich system for modifying its key bindings
+:ref:`chapter-keymaps`. For the most common tweaks, the following
+variables are available.
+
+.. elisp:autovariable:: evil-toggle-key
+
+.. elisp:autovariable:: evil-want-C-i-jump
+
+.. elisp:autovariable:: evil-want-C-u-delete
+
+.. elisp:autovariable:: evil-want-C-u-scroll
+
+.. elisp:autovariable:: evil-want-C-d-scroll
+
+.. elisp:autovariable:: evil-want-C-w-delete
+
+.. elisp:autovariable:: evil-want-C-w-in-emacs-state
+
+.. elisp:autovariable:: evil-want-Y-yank-to-eol
+
+.. elisp:autovariable:: evil-disable-insert-state-bindings
+
+
+Search
+------
+
+.. elisp:autovariable:: evil-search-module
+
+.. elisp:autovariable:: evil-regexp-search
+
+.. elisp:autovariable:: evil-search-wrap
+
+.. elisp:autovariable:: evil-flash-delay
+
+.. elisp:autovariable:: evil-ex-hl-update-delay
+
+.. elisp:autovariable:: evil-ex-search-incremental
+
+
+Indentation
+-----------
+
+.. elisp:autovariable:: evil-auto-indent
+
+.. elisp:autovariable:: evil-shift-width
+
+.. elisp:autovariable:: evil-shift-round
+
+.. elisp:autovariable:: evil-indent-convert-tabs
+
+
+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.
+
+.. elisp:autovariable:: evil-repeat-move-cursor
+
+.. elisp:autovariable:: evil-move-cursor-back
+
+.. elisp:autovariable:: evil-move-beyond-eol
+
+.. elisp:autovariable:: evil-cross-lines
+
+.. elisp:autovariable:: evil-respect-visual-line-mode
+
+.. elisp:autovariable:: evil-track-eol
+
+.. elisp:autovariable:: evil-start-of-line
+
+
+Cursor display
+--------------
+
+A state may change the appearance of the cursor. Use the variable
+:elisp:ref:`evil-default-cursor` 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.
+
+.. elisp:autovariable:: evil-default-cursor
+
+
+Window management
+-----------------
+
+.. elisp:autovariable:: evil-auto-balance-windows
+
+.. elisp:autovariable:: evil-split-window-below
+
+.. elisp:autovariable:: evil-vsplit-window-right
+
+
+Parenthesis highlighting
+------------------------
+
+These settings concern the integration between Evil and
+``show-paren-mode``. They take no effect if this mode is not enabled.
+
+.. elisp:autovariable:: evil-show-paren-range
+
+.. elisp:autovariable:: evil-highlight-closing-paren-at-point-states
+
+
+Miscellaneous
+-------------
+
+.. elisp:autovariable:: evil-want-fine-undo
+
+.. elisp:autovariable:: evil-undo-system
+
+.. elisp:autovariable:: evil-backspace-join-lines
+
+.. elisp:autovariable:: evil-kbd-macro-suppress-motion-error
+
+.. elisp:autovariable:: evil-mode-line-format
+
+.. elisp:autovariable:: evil-mouse-word
+
+.. elisp:autovariable:: evil-bigword
+
+.. elisp:autovariable:: evil-esc-delay
+
+.. elisp:autovariable:: evil-intercept-esc
+
+.. elisp:autovariable:: evil-kill-on-visual-paste
+
+.. elisp:autovariable:: evil-echo-state
+
+.. elisp:autovariable:: evil-complete-all-buffers
+
+.. elisp:autovariable:: evil-want-empty-ex-last-command
+
+
+.. rubric:: Footnotes
+
+.. [#order] Strictly speaking, the order only matters if the variable
+ affects the way Evil is loaded. This is the case with some
+ variables.
diff --git a/elpa/evil-1.15.0/evil-autoloads.el b/elpa/evil-1.15.0/evil-autoloads.el
new file mode 100644
index 0000000..f5b64fc
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-autoloads.el
@@ -0,0 +1,109 @@
+;;; evil-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*-
+;; Generated by the `loaddefs-generate' function.
+
+;; This file is part of GNU Emacs.
+
+;;; Code:
+
+(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path)))
+
+
+
+;;; Generated autoloads from evil-command-window.el
+
+(register-definition-prefixes "evil-command-window" '("evil-"))
+
+
+;;; Generated autoloads from evil-commands.el
+
+(register-definition-prefixes "evil-commands" '("evil-"))
+
+
+;;; Generated autoloads from evil-common.el
+
+(register-definition-prefixes "evil-common" '("bounds-of-evil-" "evil-" "forward-evil-"))
+
+
+;;; Generated autoloads from evil-core.el
+
+ (autoload 'evil-mode "evil" nil t)
+(register-definition-prefixes "evil-core" '("evil-" "turn-o"))
+
+
+;;; Generated autoloads from evil-digraphs.el
+
+(register-definition-prefixes "evil-digraphs" '("evil-digraph"))
+
+
+;;; Generated autoloads from evil-ex.el
+
+(register-definition-prefixes "evil-ex" '("evil-"))
+
+
+;;; Generated autoloads from evil-integration.el
+
+(register-definition-prefixes "evil-integration" '("evil-"))
+
+
+;;; Generated autoloads from evil-jumps.el
+
+(register-definition-prefixes "evil-jumps" '("evil-"))
+
+
+;;; Generated autoloads from evil-macros.el
+
+(register-definition-prefixes "evil-macros" '("evil-"))
+
+
+;;; Generated autoloads from evil-maps.el
+
+(register-definition-prefixes "evil-maps" '("evil-"))
+
+
+;;; Generated autoloads from evil-repeat.el
+
+(register-definition-prefixes "evil-repeat" '("evil-"))
+
+
+;;; Generated autoloads from evil-search.el
+
+(register-definition-prefixes "evil-search" '("evil-"))
+
+
+;;; Generated autoloads from evil-states.el
+
+(register-definition-prefixes "evil-states" '("evil-"))
+
+
+;;; Generated autoloads from evil-test-helpers.el
+
+(register-definition-prefixes "evil-test-helpers" '("evil-"))
+
+
+;;; Generated autoloads from evil-tests.el
+
+(register-definition-prefixes "evil-tests" '("evil-"))
+
+
+;;; Generated autoloads from evil-types.el
+
+(register-definition-prefixes "evil-types" '("evil-ex-get-optional-register-and-count"))
+
+
+;;; Generated autoloads from evil-vars.el
+
+(register-definition-prefixes "evil-vars" '("evil-"))
+
+;;; End of scraped data
+
+(provide 'evil-autoloads)
+
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; no-native-compile: t
+;; coding: utf-8-emacs-unix
+;; End:
+
+;;; evil-autoloads.el ends here
diff --git a/elpa/evil-1.15.0/evil-command-window.el b/elpa/evil-1.15.0/evil-command-window.el
new file mode 100644
index 0000000..b4c2b1a
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-command-window.el
@@ -0,0 +1,189 @@
+;;; 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.15.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-1.15.0/evil-command-window.elc b/elpa/evil-1.15.0/evil-command-window.elc
new file mode 100644
index 0000000..82560d6
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-command-window.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-commands.el b/elpa/evil-1.15.0/evil-commands.el
new file mode 100644
index 0000000..c8d8f78
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-commands.el
@@ -0,0 +1,4897 @@
+;;; 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.15.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-states)
+(require 'evil-ex)
+(require 'evil-types)
+(require 'evil-command-window)
+(require 'evil-jumps)
+(require 'evil-vars)
+(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-percentage-of-line (count)
+ "Move the cursor to COUNT % of the width of the current line.
+If no COUNT is given, default to 50%."
+ :type exclusive
+ (let ((line-length (- (line-end-position)
+ (line-beginning-position)
+ (if evil-move-beyond-eol -1 0))))
+ (move-to-column (truncate (* line-length (/ (or count 50) 100.0))))))
+
+(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 line COUNT. By default the last line."
+ :jump t
+ :type line
+ (evil-ensure-column
+ (if (null count)
+ (goto-char (point-max))
+ (goto-char (point-min))
+ (forward-line (1- count)))))
+
+(evil-define-motion evil-goto-first-line (count)
+ "Go to 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
+ (evil-ensure-column
+ (goto-char
+ (evil-normalize-position
+ (let ((size (- (point-max) (point-min))))
+ (+ (point-min)
+ (if (> size 80000)
+ (* count (/ size 100))
+ (/ (* count size) 100)))))))
+ (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))
+
+(defun evil--lowercase-markers ()
+ "Get all lowercase markers."
+ (cl-remove-if-not (lambda (x) (and (markerp (cdr x))
+ (<= ?a (car x) ?z)))
+ evil-markers-alist))
+
+(defun evil--next-mark (forwardp)
+ "Move to next lowercase mark.
+Move forward if FORWARDP is truthy or backward if falsey.
+Loop back to the top of buffer if the end is reached."
+ (let ((pos (point))
+ (sorted-markers (sort (evil--lowercase-markers)
+ (lambda (a b) (< (cdr a) (cdr b))))))
+ (cond
+ ((null sorted-markers)
+ (user-error "No marks in this buffer"))
+ (forwardp
+ (let ((next-marker (cl-some (lambda (x) (and (< pos (cdr x)) (cdr x)))
+ sorted-markers)))
+ (if next-marker
+ (goto-char (marker-position next-marker))
+ (goto-char (marker-position (cdar sorted-markers))))))
+ (t
+ (let* ((descending-markers (reverse sorted-markers))
+ (prev-marker (cl-some (lambda (x) (and (> pos (cdr x)) (cdr x)))
+ descending-markers)))
+ (if prev-marker
+ (goto-char (marker-position prev-marker))
+ (goto-char (marker-position (cdar descending-markers)))))))))
+
+(evil-define-motion evil-next-mark (count)
+ "Go to [count] next lowercase mark."
+ :keep-visual t
+ :repeat nil
+ :type exclusive
+ :jump t
+ (dotimes (_ (or count 1))
+ (evil--next-mark t)))
+
+(evil-define-motion evil-next-mark-line (count)
+ "Go to [count] line of next lowercase mark after current line."
+ :keep-visual t
+ :repeat nil
+ :type exclusive
+ :jump t
+ (if (evil--lowercase-markers)
+ (dotimes (_ (or count 1))
+ (evil-end-of-line)
+ (evil--next-mark t)
+ (evil-first-non-blank))
+ (user-error "No marks in this buffer")))
+
+(evil-define-motion evil-previous-mark (count)
+ "Go to [count] previous lowercase mark."
+ :keep-visual t
+ :repeat nil
+ :type exclusive
+ :jump t
+ (dotimes (_ (or count 1))
+ (evil--next-mark nil)))
+
+(evil-define-motion evil-previous-mark-line (count)
+ "Go to [count] line of previous lowercase mark before current line."
+ :keep-visual t
+ :repeat nil
+ :type exclusive
+ :jump t
+ (if (evil--lowercase-markers)
+ (dotimes (_ (or count 1))
+ (evil-beginning-of-line)
+ (evil--next-mark nil)
+ (evil-first-non-blank))
+ (user-error "No marks in this buffer")))
+
+(evil-define-command evil-set-col-0-mark (beg end mark)
+ "Set MARK at column 0 of line of END. Default is cursor line."
+ (interactive "<r><a>")
+ (if (< 1 (length mark))
+ (user-error "Trailing characters")
+ (save-excursion
+ (goto-char (if (eobp) end (1- end)))
+ (evil-beginning-of-line)
+ (evil-set-marker (string-to-char mark)))))
+
+(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 (evil-forward-char 1 evil-cross-lines))
+ (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."
+ :jump t
+ :type line
+ (evil-ensure-column
+ (move-to-window-line (max (or count 0)
+ (if (= (point-min) (window-start))
+ 0
+ scroll-margin)))))
+
+(evil-define-motion evil-window-middle ()
+ "Move the cursor to the middle line in the window."
+ :jump t
+ :type line
+ (evil-ensure-column
+ (move-to-window-line
+ (/ (1+ (save-excursion (move-to-window-line -1))) 2))))
+
+(evil-define-motion evil-window-bottom (count)
+ "Move the cursor to line COUNT from the bottom of the window."
+ :jump t
+ :type line
+ (evil-ensure-column
+ (move-to-window-line (- (max (or count 1) (1+ scroll-margin))))))
+
+;; 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-ensure-column
+ (setq count (or count (max 0 evil-scroll-count))
+ evil-scroll-count count
+ this-command 'next-line)
+ (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-ensure-column
+ (setq count (or count (max 0 evil-scroll-count))
+ evil-scroll-count count
+ this-command 'next-line)
+ (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-ensure-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-ensure-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-object 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-object 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))
+
+(defun evil-match (direction count)
+ "Find COUNTth next match in DIRECTION."
+ (unless (and (boundp 'evil-search-module)
+ (eq evil-search-module 'evil-search))
+ (user-error "Match text objects only work with Evil search module"))
+ (let ((pnt (point))
+ (count (abs count)) ;; Undo effect of evil-visual-direction
+ (evil-ex-search-direction 'backward)
+ (visual-state (evil-visual-state-p))
+ on-start-match in-match on-end-match)
+ (save-excursion
+ (unless (eobp) (forward-char)) ;; If on start of a match, stay there
+ (evil-ex-search 1)
+ (setq on-start-match (= evil-ex-search-match-beg pnt)
+ in-match (<= evil-ex-search-match-beg pnt (1- evil-ex-search-match-end))
+ on-end-match (= (1- evil-ex-search-match-end) pnt)
+ evil-ex-search-direction direction)
+ (cond
+ ((and visual-state on-start-match (eq 'backward direction))
+ (evil-ex-search count))
+ ((and visual-state on-end-match (eq 'forward direction))
+ (evil-ex-search count))
+ ((or in-match (eq 'backward direction))
+ (evil-ex-search (1- count)))
+ (t (evil-ex-search count)))
+ (setq pnt (point)))
+ (goto-char pnt)
+ (cond
+ ((evil-normal-state-p)
+ (evil-visual-select evil-ex-search-match-beg
+ evil-ex-search-match-end
+ 'inclusive
+ (cl-case direction ('forward +1) ('backward -1))
+ t)
+ (list evil-ex-search-match-beg evil-ex-search-match-end))
+ ((and visual-state (eq 'forward direction))
+ (goto-char (1- evil-ex-search-match-end)))
+ ((and visual-state (eq 'backward direction))
+ (goto-char evil-ex-search-match-beg))
+ ;; e.g. operator pending...
+ (t (list evil-ex-search-match-beg evil-ex-search-match-end)))))
+
+(evil-define-text-object evil-next-match (count &optional beg end type)
+ "Select next match."
+ :extend-selection t
+ (evil-match 'forward count))
+
+(evil-define-text-object evil-previous-match (count &optional beg end type)
+ "Select previous match."
+ :extend-selection t
+ (evil-match 'backward count))
+
+;;; 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>")
+ (if (and (memq type '(inclusive exclusive))
+ (not (evil-visual-state-p))
+ (eq 'evil-delete evil-this-operator)
+ (save-excursion (goto-char beg) (bolp))
+ (save-excursion (goto-char end) (eolp))
+ (<= 1 (evil-count-lines beg end)))
+ ;; Imitate Vi strangeness: if motion meets above criteria,
+ ;; delete linewise. Not for change operator or visual state.
+ (let ((new-range (evil-expand beg end 'line)))
+ (evil-delete (nth 0 new-range) (nth 1 new-range) 'line register yank-handler))
+ (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)))
+ (when (and (called-interactively-p 'any)
+ (eq type 'line))
+ (evil-first-non-blank)
+ (when (and (not evil-start-of-line)
+ evil-operator-start-col
+ ;; Special exceptions to ever saving column:
+ (not (memq evil-this-motion '(evil-forward-word-begin
+ evil-forward-WORD-begin))))
+ (move-to-column evil-operator-start-col)))))
+
+(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."
+ (let ((beg (save-excursion (evil-backward-word-begin) (point)))
+ (end (point)))
+ (cond
+ ((evil-replace-state-p) (while (< beg (point))
+ (evil-replace-backspace)))
+ ((or (not (bolp)) (bobp)) (delete-region (max beg (line-beginning-position))
+ end))
+ (evil-backspace-join-lines (delete-char -1))
+ (t (user-error "Beginning of line")))))
+
+(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'."
+ (let ((beg (if (<= (current-column) (current-indentation))
+ (line-beginning-position)
+ (save-excursion
+ (evil-first-non-blank)
+ (point)))))
+ (cond
+ ((and (bolp) (evil-replace-state-p)) (evil-replace-backspace))
+ ((bolp) (evil-delete-backward-char-and-join 1))
+ ((evil-replace-state-p) (while (< beg (point))
+ (evil-replace-backspace)))
+ (t (delete-region beg (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]"
+ :restore-point t
+ (interactive "<R><xc/><y>")
+ (evil-ex-delete-or-yank nil beg end type register count yank-handler))
+
+(evil-define-command evil-ex-put (beg end ex-arg &optional force)
+ (interactive "<r><a><!>")
+ (let* ((arg-chars (remove ?\s (string-to-list ex-arg)))
+ (reg (or (car arg-chars) ?\"))
+ (text (cond
+ ((and (< 1 (length arg-chars))
+ (/= ?= reg))
+ (user-error "Trailing characters"))
+ ((eq ?= reg)
+ (evil--eval-expr (if (= 1 (length arg-chars))
+ evil-last-=-register-input
+ (setq evil-last-=-register-input (substring ex-arg 1)))))
+ (t (evil-get-register reg)))))
+ (unless text (user-error "Nothing in register %c" reg))
+ (evil-remove-yank-excluded-properties text)
+ (goto-char (if (= (point-max) end) end (1- end)))
+ (if force (evil-insert-newline-above) (evil-insert-newline-below))
+ (evil-set-marker ?\[ (point))
+ ;; `insert' rather than `insert-for-yank' as we want to ignore yank-handlers...
+ (insert (if (and (< 0 (length text))
+ (eq ?\n (aref text (1- (length text)))))
+ (substring text 0 (1- (length text)))
+ text))
+ (evil-set-marker ?\] (1- (point)))
+ (back-to-indentation)
+ (evil-normal-state)))
+
+(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)
+ (setq this-command 'evil-change-whole-line) ; for evil-maybe-remove-spaces
+ (if (= opoint (point))
+ (evil-open-above 1)
+ (evil-open-below 1)))
+ ((eq type 'block)
+ (evil-insert 1 nlines))
+ (t
+ (evil-insert 1)))
+ (setq evil-this-register nil)))
+
+(evil-define-operator evil-change-line (beg end type register yank-handler)
+ "Change to end of line, or change whole line if characterwise visual mode."
+ :motion evil-end-of-line-or-visual-line
+ (interactive "<R><x><y>")
+ (if (and (evil-visual-state-p) (eq 'inclusive type))
+ (cl-destructuring-bind (beg* end* &rest) (evil-line-expand beg end)
+ (evil-change-whole-line beg* end* register yank-handler))
+ (evil-change beg end type register yank-handler #'evil-delete-line)))
+
+(evil-define-operator evil-change-whole-line
+ (beg end register yank-handler)
+ "Change whole line."
+ :motion evil-line-or-visual-line
+ :type line
+ (interactive "<r><x>")
+ (evil-change beg end 'line 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>")
+ (unless (= (1+ address) (line-number-at-pos beg))
+ (goto-char (point-min))
+ (forward-line address)
+ (let* ((m (set-marker (make-marker) (point)))
+ (txt (buffer-substring-no-properties beg end))
+ (len (length txt))
+ (last-line-blank (progn (goto-char (point-max)) (bolp))))
+ (delete-region beg end)
+ (unless last-line-blank ; as vim, preserve lack of blank last line
+ (progn (goto-char (point-max)) (when (bolp) (delete-char -1))))
+ (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))))))
+
+(defun evil--check-undo-system ()
+ (when (and (eq evil-undo-system 'undo-tree)
+ (not (bound-and-true-p undo-tree-mode)))
+ (user-error "Enable `global-undo-tree-mode' to use undo-tree commands.
+Add (add-hook 'evil-local-mode-hook 'turn-on-undo-tree-mode) to your init file for undo in non-file buffers.")))
+
+(evil-define-command evil-undo (count)
+ "Undo COUNT changes in buffer using `evil-undo-function'."
+ :repeat abort
+ (interactive "*p")
+ (evil--check-undo-system)
+ (funcall evil-undo-function count))
+
+(evil-define-command evil-redo (count)
+ "Undo COUNT changes in buffer using `evil-redo-function'."
+ :repeat abort
+ (interactive "*p")
+ (evil--check-undo-system)
+ (funcall evil-redo-function count))
+
+(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. Location of point
+is preserved relative to text when called from insert state.
+Otherwise, it is determined by `evil-start-of-line' and/or `evil-track-eol'.
+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. Location of point
+is preserved relative to text when called from insert or replace states.
+Otherwise, it is determined by `evil-start-of-line' and/or `evil-track-eol'.
+See also `evil-shift-left'."
+ :type line
+ :move-point nil ; point is moved according to `evil-start-of-line' and state
+ (interactive "<r><vc>")
+ (setq count (or count 1))
+ (let ((beg (set-marker (make-marker) beg))
+ (end (set-marker (make-marker) end))
+ (col-for-insert (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) its position is determined by `evil-start-of-line'.
+ (cond
+ ((or (evil-insert-state-p) (evil-replace-state-p))
+ (move-to-column (max 0 (+ col-for-insert first-shift))))
+ (evil-start-of-line (evil-first-non-blank))
+ ((evil--stick-to-eol-p) (move-end-of-line 1))
+ (t (move-to-column (or goal-column evil-operator-start-col col-for-insert))))
+ (setq temporary-goal-column 0)))
+
+(defun evil-delete-indentation ()
+ "Delete all indentation on current line."
+ (interactive)
+ (save-excursion
+ (evil-beginning-of-line)
+ (delete-region (point) (progn (skip-chars-forward " \t") (point)))))
+
+(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>")
+ (if (and (eq 'self-insert-command last-command)
+ (eq ?0 (char-before)))
+ (progn (backward-delete-char 1)
+ (evil-delete-indentation))
+ (evil-shift-left (line-beginning-position) (line-beginning-position 2) count t)))
+
+(evil-define-operator evil-align-left (beg end type &optional width)
+ "Left-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 evil-paste-clear-minibuffer-first
+ (delete-minibuffer-contents)
+ (setq evil-paste-clear-minibuffer-first nil))
+ (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)))))
+
+(defun evil-insert-for-yank-at-col (startcol _endcol string count)
+ "Insert STRING at STARTCOL."
+ (move-to-column startcol)
+ (dotimes (_ (or count 1))
+ (insert-for-yank string))
+ (evil-set-marker ?\] (1- (point))))
+
+(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)))
+ (dir (evil-visual-direction))
+ beg end paste-eob)
+ (evil-with-undo
+ (let ((kill-ring-yank-pointer (when kill-ring (list (current-kill 0)))))
+ (when (evil-visual-state-p)
+ (setq beg evil-visual-beginning
+ end evil-visual-end)
+ (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 beg end (evil-visual-type) (unless evil-kill-on-visual-paste ?_))
+ (when (and (eq yank-handler #'evil-yank-line-handler)
+ (not (memq (evil-visual-type) '(line block)))
+ (not (= evil-visual-end (point-max))))
+ (insert "\n"))
+ (evil-normal-state)
+ (when kill-ring (current-kill 1)))
+ ;; Effectively memoize `evil-get-register' because it can be
+ ;; side-effecting (e.g. for the `=' register)...
+ (cl-letf (((symbol-function 'evil-get-register)
+ (lambda (&rest _) text)))
+ (cond
+ ((eq 'block (evil-visual-type))
+ (when (eq yank-handler #'evil-yank-line-handler)
+ (setq text (concat "\n" text)))
+ (evil-set-marker ?\[ beg)
+ (evil-apply-on-block #'evil-insert-for-yank-at-col beg end t text count))
+ (paste-eob (evil-paste-after count register))
+ (t (evil-paste-before count register)))))
+ (when evil-kill-on-visual-paste
+ (current-kill -1))
+ ;; Ensure that gv can restore visually pasted area...
+ (setq evil-visual-previous-mark evil-visual-mark
+ evil-visual-mark (evil-get-marker (if (<= 0 dir) ?\[ ?\]) t)
+ evil-visual-previous-point evil-visual-point
+ evil-visual-point (evil-get-marker (if (<= 0 dir) ?\] ?\[) t))
+ ;; 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* ((opoint (point))
+ (overlay (make-overlay opoint (+ opoint (if (evil-replace-state-p) 1 0)))))
+ (unwind-protect
+ (progn
+ (overlay-put overlay 'invisible t)
+ (overlay-put overlay 'after-string (propertize "\""
+ 'face 'minibuffer-prompt
+ 'cursor 1))
+ (list (or evil-this-register (read-char))))
+ (delete-overlay overlay))))
+ (let ((opoint (point))
+ (evil-move-cursor-back nil)
+ reg-length chars-to-delete)
+ (evil-paste-before nil register t)
+ (when (evil-replace-state-p)
+ (setq reg-length (- (point) opoint)
+ chars-to-delete (min (- (point-at-eol) (point)) reg-length))
+ ;; TODO: handle multi-line paste backspacing
+ (evil-update-replace-alist (point) reg-length chars-to-delete chars-to-delete)
+ (delete-char chars-to-delete))))
+
+(defun evil-paste-last-insertion ()
+ "Paste last insertion."
+ (interactive)
+ (evil-paste-from-register ?.))
+
+(defun evil-paste-last-insertion-and-stop-insert ()
+ "Paste last insertion and change to normal state."
+ (interactive)
+ (evil-paste-last-insertion)
+ (evil-normal-state))
+
+(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.")
+
+(defun evil-end-and-return-macro ()
+ "Like `kmacro-end-macro' but also return the macro.
+Remove \\<evil-insert-state-map>\\[evil-execute-in-normal-state] from the end."
+ ;; `end-kbd-macro' rather than `kmacro-end-macro' to allow clearing registers
+ (end-kbd-macro nil #'kmacro-loop-setup-function)
+ (let ((end-keys-seq (append evil-execute-normal-keys nil))
+ (last-kbd-macro-seq (append last-kbd-macro nil)))
+ (unless last-kbd-macro-seq
+ (setq last-kbd-macro nil))
+ (if (and end-keys-seq last-kbd-macro-seq)
+ (apply #'vector (butlast last-kbd-macro-seq (length end-keys-seq)))
+ last-kbd-macro)))
+
+(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)))))
+ (let (last-macro)
+ (cond
+ ((eq register ?\C-g)
+ (keyboard-quit))
+ ((and evil-this-macro defining-kbd-macro)
+ (setq evil-macro-buffer nil)
+ (condition-case nil
+ (setq last-macro (evil-end-and-return-macro))
+ (error nil))
+ (when last-macro
+ (evil-set-register evil-this-macro last-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 (<= ?0 register ?9)
+ (<= ?a register ?z)
+ (<= ?A register ?Z))
+ (when defining-kbd-macro (end-kbd-macro))
+ (setq evil-this-macro register)
+ (evil-set-register evil-this-macro nil)
+ (kmacro-start-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
+ (dotimes (_ (or count 1))
+ (execute-kbd-macro macro)))
+ ;; 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))
+ (type (evil-visual-type)))
+ ;; TODO handle swapping selection in visual state...
+ (unless (evil-visual-state-p)
+ (cond
+ ;; No previous selection.
+ ((or (null evil-visual-selection)
+ (null evil-visual-mark)
+ (null evil-visual-point)))
+ (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-quoted-insert (count)
+ "Like `quoted-insert' but delete COUNT chars forward in replace state.
+Adds a `^' overlay as an input prompt."
+ (interactive "p")
+ (let* ((opoint (point))
+ chars-to-delete insert-prompt)
+ (unwind-protect
+ (progn
+ (if (evil-replace-state-p)
+ (progn
+ (setq chars-to-delete (min (- (point-at-eol) opoint) count)
+ insert-prompt (make-overlay opoint (+ chars-to-delete opoint)))
+ (evil-update-replace-alist opoint count chars-to-delete))
+ (setq insert-prompt (make-overlay opoint opoint)))
+ (overlay-put insert-prompt 'invisible t)
+ (overlay-put insert-prompt 'after-string (propertize "^"
+ 'face 'escape-glyph
+ 'cursor 1))
+ (let (overwrite-mode) ;; Force `read-quoted-char'
+ (quoted-insert count))
+ (when (evil-replace-state-p) (delete-char chars-to-delete)))
+ (when insert-prompt (delete-overlay insert-prompt)))))
+
+(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 vcount non-blank-p)
+ "Switch to insert state at the beginning of the current line.
+If NON-BLANK-P is non-nil, point is placed at the first non-blank character
+on the current line. If NON-BLANK-P is nil, point is placed at column 0,
+or the beginning of visual 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."
+ (push (point) buffer-undo-list)
+ (let ((move-fn (if non-blank-p #'back-to-indentation #'evil-beginning-of-line)))
+ (if (and visual-line-mode
+ evil-respect-visual-line-mode)
+ (goto-char
+ (max (save-excursion
+ (funcall move-fn)
+ (point))
+ (save-excursion
+ (beginning-of-visual-line)
+ (point))))
+ (funcall move-fn)))
+ (setq evil-insert-count count
+ evil-insert-lines nil
+ evil-insert-vcount
+ (and vcount
+ (> vcount 1)
+ (list (line-number-at-pos)
+ (if non-blank-p #'evil-first-non-blank #'evil-beginning-of-line)
+ vcount)))
+ (evil-insert-state 1))
+
+(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")
+ (evil--insert-line count vcount t))
+
+(defun evil-insert-0-line (count &optional vcount)
+ "Switch to insert state at beginning of current line.
+Point is placed at column 0, or the beginning of the visual 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")
+ (evil--insert-line count vcount nil))
+
+(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 ((opoint (point))
+ chars-to-delete insert-prompt)
+ (if (evil-replace-state-p)
+ (progn
+ (setq chars-to-delete (min (- (point-at-eol) opoint) count)
+ insert-prompt (make-overlay opoint (+ chars-to-delete opoint)))
+ (evil-update-replace-alist opoint count chars-to-delete))
+ (setq insert-prompt (make-overlay opoint opoint)))
+ (insert-char (evil-read-digraph-char-with-overlay insert-prompt) count)
+ (when chars-to-delete (delete-char chars-to-delete))))
+
+(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 "Error: %S" (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-update ()
+ "Same as `evil-write', but only write when the buffer has been modified."
+ :motion nil
+ :move-point nil
+ :type line
+ :repeat nil
+ (when (buffer-modified-p)
+ (call-interactively #'evil-write)))
+
+(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"))
+ (cond
+ ((/= (aref file 0) ?!)
+ (when (member file '("#" "%"))
+ (setq file (evil-ex-replace-special-filenames file)))
+ (let ((result (insert-file-contents file)))
+ (save-excursion
+ (forward-char (cadr result))
+ (unless (bolp) (insert "\n")))))
+ (t
+ (shell-command (evil-ex-replace-special-filenames (substring file 1)) t)
+ (goto-char (mark))
+ (unless (bolp) (insert "\n"))
+ (forward-line -1)))))
+
+(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 (registers)
+ "Shows the contents of REGISTERS, or all registers, if none supplied."
+ :repeat nil
+ (interactive "<a>")
+ (let* ((all-registers (evil-register-list))
+ (reg-chars (string-to-list registers))
+ (display-regs (if reg-chars
+ (cl-remove-if-not (lambda (r) (memq (car r) reg-chars))
+ all-registers)
+ all-registers)))
+ (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 display-regs
+ 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))))
+
+(defun evil--parse-delmarks (to-be-parsed &optional parsed)
+ "Where TO-BE-PARSED can contain ranges in the form `x-y'.
+PARSED is a list of characters whose marks should be deleted.
+Like vim, on invalid input, preceeding valid input is still parsed."
+ (cl-destructuring-bind (&optional a b c &rest) to-be-parsed
+ (cond
+ ((null to-be-parsed) parsed)
+ ;; single mark...
+ ((and (not (eq ?- b)) (or (<= ?a a ?z) (<= ?A a ?Z) (<= ?0 a ?9)
+ (memq a '(?\" ?^ ?. ?\[ ?\] ?< ?>))))
+ (evil--parse-delmarks (cdr to-be-parsed) (cons a parsed)))
+ ;; range of marks...
+ ((and (eq ?- b) c (or (<= ?a a c ?z) (<= ?A a c ?Z) (<= ?0 a c ?9)))
+ (evil--parse-delmarks (nthcdr 3 to-be-parsed)
+ (append parsed (number-sequence a c))))
+ (t (progn (message "Invalid input: %s" (apply #'string (remove nil to-be-parsed)))
+ parsed)))))
+
+(evil-define-command evil-delete-marks (marks &optional force)
+ "MARKS is a string denoting all marks to be deleted. Mark names are
+either single characters or a range of characters in the form `x-y'.
+If FORCE is non-nil and MARKS is blank, all local marks except 0-9 are removed."
+ (interactive "<a><!>")
+ (let ((mark-chars (remove ?\s (append marks nil))))
+ (cond
+ ((and force mark-chars) (message "Invalid input"))
+ (mark-chars
+ (let* ((delmarks (evil--parse-delmarks mark-chars))
+ (delmarkp (lambda (m) (member (car m) delmarks))))
+ ;; delete all parsed marks...
+ (setq evil-markers-alist
+ (cl-remove-if delmarkp evil-markers-alist))
+ ;; ensure all parsed marks are deleted globally...
+ (set-default 'evil-markers-alist
+ (cl-remove-if delmarkp (default-value 'evil-markers-alist)))))
+ ;; delete local marks except 0-9...
+ (force (setq evil-markers-alist
+ (cl-remove-if-not (lambda (m) (<= ?0 (car m) ?9))
+ 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 position if present."
+ (require 'ffap)
+ (let ((fname (with-no-warnings (ffap-file-at-point))))
+ (unless fname
+ (user-error "File does not exist."))
+ (let* ((line-number-pattern ":\\([0-9]+\\)\\=" )
+ (line-and-column-numbers-pattern ":\\([0-9]+\\):\\([0-9]+\\)\\=")
+ (get-number (lambda (pattern match-number)
+ (save-excursion
+ (goto-char (cadr ffap-string-at-point-region))
+ (and (re-search-backward pattern (line-beginning-position) t)
+ (string-to-number (match-string match-number))))))
+ (line-number (or (funcall get-number line-and-column-numbers-pattern 1)
+ (funcall get-number line-number-pattern 1)))
+ (column-number (funcall get-number line-and-column-numbers-pattern 2)))
+ (message "line: %s, column: %s" line-number column-number)
+ (with-no-warnings (find-file-at-point fname))
+ (when line-number
+ (goto-char (point-min))
+ (forward-line (1- line-number))
+ (when column-number
+ (move-to-column (1- column-number)))))))
+
+(evil-define-command evil-find-file-at-point-visual ()
+ "Find the filename selected by the visual region.
+ Returns an error message if the file does not exist."
+ (require 'ffap)
+ (let ((region (buffer-substring (region-beginning) (region-end))))
+ (if (file-exists-p region)
+ (find-file-at-point region)
+ (user-error (format "Can't find file \"%s\" in path" region)))))
+
+(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))
+ (evil-repeat-record (evil-ex-pattern-regex evil-ex-search-pattern))
+ ;; If it weren't for the fact that `exit-minibuffer' throws an `exit'
+ ;; tag, which bypasses the source of `this-command-keys', we'd be able
+ ;; to capture the key(s) in the post-command of the operator as usual.
+ ;; Fortunately however, `last-input-event' can see the key (by default, `return')
+ (unless (append (this-command-keys) nil)
+ (evil-repeat-record (vector last-input-event))))
+ (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 (= match-end end-marker) (not match-contains-newline) (bolp))
+ ;; The range (beg end) includes the final newline which means
+ ;; end-marker is on one line down.
+ ;; With the exception of explicitly substituting newlines,
+ ;; we abort when the match ends here and it's an empty line
+ (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)
+ (when evil-ex-search-vim-style-regexp
+ (setq pattern (evil-transform-vim-style-regexp pattern)))
+ (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."
+ :jump t
+ (interactive "<N>")
+ (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>")
+ (select-window
+ (split-window (selected-window) (when count (- count))
+ (if evil-split-window-below 'below 'above)))
+ (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>")
+ (select-window
+ (split-window (selected-window) (when count (- count))
+ (if evil-vsplit-window-right 'right 'left)))
+ (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) (when count (- count))
+ (if evil-split-window-below 'below 'above))))
+ (when (and (not count) evil-auto-balance-windows)
+ (balance-windows (window-parent)))
+ (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))))
+ (when file
+ (evil-edit file))))
+
+(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) (when count (- count))
+ (if evil-vsplit-window-right 'right 'left))))
+ (when (and (not count) evil-auto-balance-windows)
+ (balance-windows (window-parent)))
+ (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))))
+ (when file
+ (evil-edit file))))
+
+(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))))))
+
+(defvar evil-execute-normal-keys nil
+ "The keys used to invoke the current `evil-execute-in-normal-state'.
+Can be used to detect if we are currently in that quasi-state.
+With current bindings, it will be \\<evil-insert-state-map>\\[evil-execute-in-normal-state]")
+
+(evil-define-local-var evil--execute-normal-eol-pos nil
+ "Vim has special behaviour for executing in normal state at eol.
+This var stores the eol position, so it can be restored when necessary.")
+
+(defun evil--restore-repeat-hooks ()
+ "No insert-state repeat info is recorded after executing in normal state.
+Restore the disabled repeat hooks on insert-state exit."
+ (evil-repeat-stop)
+ (add-hook 'pre-command-hook 'evil-repeat-pre-hook)
+ (add-hook 'post-command-hook 'evil-repeat-post-hook)
+ (remove-hook 'evil-insert-state-exit-hook 'evil--restore-repeat-hooks))
+
+(defvar evil--execute-normal-return-state nil
+ "The state to return to after executing in normal state.")
+
+(defun evil-execute-in-normal-state ()
+ "Execute the next command in Normal state."
+ (interactive)
+ (evil-delay '(not (memq this-command
+ '(nil
+ evil-execute-in-normal-state
+ evil-replace-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)
+ (when (and evil--execute-normal-eol-pos
+ (= (point) (1- evil--execute-normal-eol-pos))
+ (not (memq this-command '(evil-insert
+ evil-goto-mark))))
+ (forward-char))
+ (unless (memq evil-state '(replace insert))
+ (evil-change-state ',evil-state))
+ (when (eq 'insert evil-state)
+ (remove-hook 'pre-command-hook 'evil-repeat-pre-hook)
+ (remove-hook 'post-command-hook 'evil-repeat-post-hook)
+ (add-hook 'evil-insert-state-exit-hook 'evil--restore-repeat-hooks))
+ (setq evil-move-cursor-back ',evil-move-cursor-back
+ evil-move-beyond-eol ',evil-move-beyond-eol
+ evil-execute-normal-keys nil)))
+ 'post-command-hook)
+ (setq evil-insert-count nil
+ evil--execute-normal-return-state evil-state
+ evil--execute-normal-eol-pos (when (eolp) (point))
+ evil-move-cursor-back nil
+ evil-execute-normal-keys (this-command-keys))
+ (evil-normal-state)
+ (setq evil-move-beyond-eol t)
+ (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-1.15.0/evil-commands.elc b/elpa/evil-1.15.0/evil-commands.elc
new file mode 100644
index 0000000..86eacc4
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-commands.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-common.el b/elpa/evil-1.15.0/evil-common.el
new file mode 100644
index 0000000..1dcb8be
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-common.el
@@ -0,0 +1,4067 @@
+;;; 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.15.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)
+(require 'calc)
+
+;;; 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
+ (with-no-warnings
+ (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 (equal seq "0")
+ 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-with-overlay (overlay)
+ "Read two chars, displaying the first in OVERLAY, replacing `?'.
+Return the digraph from `evil-digraph', else return second char."
+ (interactive)
+ (let (char1 char2 string)
+ (unwind-protect
+ (progn
+ (overlay-put overlay 'invisible t)
+ ;; create overlay prompt
+ (setq string (propertize "?"
+ 'face 'minibuffer-prompt
+ 'cursor 1))
+ (overlay-put overlay 'after-string string)
+ (setq char1 (read-key))
+ (setq string (propertize (string char1)
+ 'face 'minibuffer-prompt
+ 'cursor 1))
+ (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-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 ((overlay (make-overlay (point)
+ (min (point-max)
+ (+ (or hide-chars 1)
+ (point))))))
+ (evil-read-digraph-char-with-overlay overlay)))
+
+(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* ((seq (substring keys beg end))
+ (cmd (key-binding seq)))
+ (cond
+ ((memq cmd '(undefined nil))
+ (user-error "No command bound to %s" seq))
+ ((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
+ (equal (vconcat seq) (vector ?0))))
+ ;; 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
+ seq
+ (when (< end len)
+ (substring keys end))))))
+ (t ; append a further event
+ (setq end (1+ end))))))
+ (user-error "Key sequence contains no complete binding"))))
+
+(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 and the tab line (on Emacs 27 and later versions).
+
+On Emacs 24 and later versions, the y-offset returned by
+`posn-at-point' is relative to the text area excluding the header
+line and the tab line, while y offset taken by `posn-at-x-y' is relative to
+the buffer area including the header line and the tab 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))))))
+ (when (fboundp 'window-tab-line-height)
+ (setcdr xy (+ (cdr xy) (window-tab-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--stick-to-eol-p ()
+ "Called by vertical movement commands to help determine cursor position."
+ (let ((goal-col (or goal-column
+ (if (consp temporary-goal-column)
+ (car temporary-goal-column)
+ temporary-goal-column))))
+ (and evil-track-eol
+ (= most-positive-fixnum goal-col)
+ (eq last-command 'next-line))))
+
+(defun evil-eolp ()
+ "Like `eolp' but accounts for `evil-move-beyond-eol' being nil."
+ (ignore-errors
+ (save-excursion
+ (unless (or evil-move-beyond-eol (memq evil-state '(insert replace)))
+ (forward-char))
+ (eolp))))
+
+(defmacro evil-ensure-column (&rest body)
+ "Execute BODY so that column after execution is correct.
+If `evil-start-of-line' is nil, treat BODY as if it were a `next-line' command.
+This mostly copies the approach of Emacs' `line-move-1', but is modified
+so it is more compatible with evil's notions of eol & tracking."
+ (declare (indent defun)
+ (debug t))
+ (let ((normalize-temporary-goal-column
+ `(if (consp temporary-goal-column)
+ (setq temporary-goal-column (+ (car temporary-goal-column)
+ (cdr temporary-goal-column))))))
+ `(progn
+ (unless evil-start-of-line (setq this-command 'next-line))
+ ,normalize-temporary-goal-column
+ (if (not (memq last-command '(next-line previous-line)))
+ (setq temporary-goal-column
+ (if (and evil-track-eol
+ (evil-eolp)
+ (memq real-last-command '(move-end-of-line evil-end-of-line)))
+ most-positive-fixnum
+ (current-column))))
+ ,@body
+ (if evil-start-of-line
+ (evil-first-non-blank)
+ ,normalize-temporary-goal-column
+ (line-move-to-column (truncate (or goal-column temporary-goal-column)))))))
+
+(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 to 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
+ "<\\([^/ >\n]+\\)\\(?:=>?\\|[^\"/>]\\|\"[^\"]*\"\\)*?>\\|</\\([^>]+?\\)>"
+ 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)
+ "\\(?:>\\|[ \n]\\(?:[^\"/>]\\|\"[^\"]*\"\\)*?>\\)"))
+ (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 evil--forward-word-respect-categories (count)
+ "Move forward COUNT words.
+A word is a sequence of word characters matching [[:word:]]
+\(recognized by `forward-word')."
+ (let ((word-separating-categories evil-cjk-word-separating-categories)
+ (word-combining-categories evil-cjk-word-combining-categories)
+ (pnt (point)))
+ (forward-word count)
+ (if (= pnt (point)) count 0)))
+
+(defun evil--forward-non-word-excl-newline (count)
+ "Move forward COUNT non-words.
+A non-word is a sequence of non-whitespace non-word characters."
+ (evil-forward-chars "^[:word:]\n\r\t\f " count))
+
+(defun evil--forward-non-word-incl-newline (count)
+ "Move forward COUNT non-words.
+A non-word is a sequence of non-space, non-tab, non-word characters."
+ (evil-forward-chars "^[:word:]\t " 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
+ #'evil--forward-word-respect-categories
+ #'evil--forward-non-word-excl-newline
+ #'forward-evil-empty-line))
+
+(defun forward-evil-word-object (&optional count)
+ "Move forward COUNT words.
+Like `forward-evil-word' but include newline in non-word chars."
+ (evil-forward-nearest count
+ #'evil--forward-word-respect-categories
+ #'evil--forward-non-word-incl-newline
+ #'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-WORD-object (&optional count)
+ "Move forward COUNT \"WORDS\".
+Like `forward-evil-WORD' but exclude newline in WORD chars."
+ (evil-forward-nearest count
+ #'(lambda (&optional cnt)
+ (evil-forward-chars "^\t " 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--eval-expr (input)
+ "Eval INPUT and return stringified result, if of a suitable type.
+If INPUT starts with a number, +, -, or . use `calc-eval' instead."
+ (let* ((first-char (car (remove ?\s (string-to-list input))))
+ (calcable-p (and first-char (or (<= ?0 first-char ?9)
+ (memq first-char '(?- ?+ ?.)))))
+ (result (if calcable-p
+ (let ((calc-multiplication-has-precedence nil))
+ (calc-eval input))
+ (eval (car (read-from-string input))))))
+ (cond
+ (calcable-p result)
+ ((or (stringp result)
+ (numberp result)
+ (symbolp result))
+ (format "%s" result))
+ ((sequencep result)
+ (mapconcat (lambda (x) (format "%s" x)) result "\n"))
+ (t (user-error "Using %s as a string" (type-of result))))))
+
+(defvar evil-paste-clear-minibuffer-first nil
+ "`evil-paste-before' cannot have `delete-minibuffer-contents' called before
+it fetches certain registers becuase this would trigger various ex-updates,
+sometimes moving point, so `C-a' `C-w' etc. would miss their intended target.")
+
+(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))
+ (if (eq this-original-command 'evil-paste-from-register)
+ (setq evil-paste-clear-minibuffer-first t)
+ (delete-minibuffer-contents)))
+ (remove-hook 'pre-command-hook #'evil-ex-remove-default))
+(put 'evil-ex-remove-default '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))
+ ((<= ?1 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 ?\C-L)
+ (unless (evil-ex-p)
+ (user-error "Register <C-l> only available in ex state"))
+ (with-current-buffer evil-ex-current-buffer
+ (replace-regexp-in-string "\n\\'" "" (thing-at-point 'line))))
+ ((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))
+ (setq evil-last-=-register-input
+ (minibuffer-with-setup-hook
+ (lambda () (when evil-last-=-register-input
+ (add-hook 'pre-command-hook #'evil-ex-remove-default)))
+ (read-from-minibuffer
+ "="
+ (and evil-last-=-register-input
+ (propertize evil-last-=-register-input 'face 'shadow))
+ evil-eval-map
+ nil
+ 'evil-eval-history
+ evil-last-=-register-input
+ t)))
+ (evil--eval-expr evil-last-=-register-input)))
+ ((eq register ?_) ; the black hole register
+ "")
+ (t
+ (setq register (downcase register))
+ (get-register register)))
+ (user-error "Register `%c' is empty" register)))
+ (error (unless noerror (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))
+ (list (cons ?= evil-last-=-register-input))
+ (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 they 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))
+ 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.
+Supplied as the `undo' element of a yank handler."
+ (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)
+ (when (eq last-command 'evil-visual-paste)
+ (evil-swap evil-visual-previous-mark evil-visual-mark)
+ (evil-swap evil-visual-previous-point evil-visual-point))
+ (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-1.15.0/evil-common.elc b/elpa/evil-1.15.0/evil-common.elc
new file mode 100644
index 0000000..b6205c1
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-common.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-core.el b/elpa/evil-1.15.0/evil-core.el
new file mode 100644
index 0000000..cf75497
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-core.el
@@ -0,0 +1,1392 @@
+;;; 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.15.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))
+ (lookup-key (keymap-parent map) key)))
+ (aux (lookup-key map key)))
+ (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."
+ (declare (indent defun))
+ (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-1.15.0/evil-core.elc b/elpa/evil-1.15.0/evil-core.elc
new file mode 100644
index 0000000..e891a09
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-core.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-development.el b/elpa/evil-1.15.0/evil-development.el
new file mode 100644
index 0000000..60da92d
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-development.el
@@ -0,0 +1,50 @@
+;;; evil-development.el --- Useful features for Evil developers -*- lexical-binding: t -*-
+
+;; Author: Justin Burkett <justin at burkett dot cc>
+
+;; Version: 1.15.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-1.15.0/evil-development.elc b/elpa/evil-1.15.0/evil-development.elc
new file mode 100644
index 0000000..d490158
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-development.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-digraphs.el b/elpa/evil-1.15.0/evil-digraphs.el
new file mode 100644
index 0000000..9baef3d
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-digraphs.el
@@ -0,0 +1,1729 @@
+;;; 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.15.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-1.15.0/evil-digraphs.elc b/elpa/evil-1.15.0/evil-digraphs.elc
new file mode 100644
index 0000000..c4f2004
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-digraphs.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-ex.el b/elpa/evil-1.15.0/evil-ex.el
new file mode 100644
index 0000000..c58ea13
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-ex.el
@@ -0,0 +1,1188 @@
+;;; 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.15.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 'evil-types)
+(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))
+ ("*" #'(evil-ex-last-visual-range))
+ ((alt "," ";") line #'(evil-ex-range (evil-ex-current-line) $2))
+ (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))
+ ("`" marker-name ",`" marker-name
+ #'(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
+ ("'" marker-name #'(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)))
+ (marker-name
+ "[]\\[-a-zA-Z_<>'}{)(]")
+ (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
+ evil-want-empty-ex-last-command
+ (propertize evil-ex-previous-command 'face 'shadow)))
+ evil-ex-completion-map
+ nil
+ 'evil-ex-history
+ (when evil-want-empty-ex-last-command
+ 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 (and (zerop (length result))
+ evil-want-empty-ex-last-command)
+ (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 (or (minibufferp)
+ (memq this-command '(mouse-drag-region choose-completion)))
+ (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-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 "1.2.13")
+
+(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))
+ (restore-point (when (evil-get-command-property evil-ex-command :restore-point)
+ (min (point) (or (mark) most-positive-fixnum))))
+ (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)
+ (evil-exit-visual-state)
+ (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 restore-point (goto-char restore-point)))))
+ (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-last-visual-range ()
+ "Return a linewise range of the last visual selection."
+ (evil-line-expand evil-visual-mark evil-visual-point))
+
+(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)
+ (if (re-search-forward pattern nil t)
+ (line-number-at-pos (1- (match-end 0)))
+ (goto-char (point-min))
+ (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)
+ (if (re-search-backward pattern nil t)
+ (line-number-at-pos (match-beginning 0))
+ (goto-char (point-max))
+ (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-1.15.0/evil-ex.elc b/elpa/evil-1.15.0/evil-ex.elc
new file mode 100644
index 0000000..ba332a2
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-ex.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-integration.el b/elpa/evil-1.15.0/evil-integration.el
new file mode 100644
index 0000000..03fc3cf
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-integration.el
@@ -0,0 +1,511 @@
+;;; 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.15.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
+(eval-after-load 'undo-tree
+ '(with-no-warnings
+ (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-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-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-")))
+
+;;; XRef
+(eval-after-load 'xref
+ '(progn
+ (evil-set-command-property 'xref-find-definitions :jump t)
+ (evil-set-command-property 'xref-find-references :jump t)))
+
+(provide 'evil-integration)
+
+;;; evil-integration.el ends here
diff --git a/elpa/evil-1.15.0/evil-integration.elc b/elpa/evil-1.15.0/evil-integration.elc
new file mode 100644
index 0000000..dba3a95
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-integration.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-jumps.el b/elpa/evil-1.15.0/evil-jumps.el
new file mode 100644
index 0000000..fea2e43
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-jumps.el
@@ -0,0 +1,354 @@
+;;; evil-jumps.el --- Jump list implementation -*- lexical-binding: t -*-
+
+;; Author: Bailey Ling <bling at live.ca>
+
+;; Version: 1.15.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)
+
+(defvar evil--jumps-jumping-backward nil
+ "Set by `evil--jump-backward', used and cleared in the
+`post-command-hook' by `evil--jump-handle-buffer-crossing'")
+
+(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)
+ previous-pos)
+
+;; Is inlining this really worth it?
+(defsubst evil--jumps-message (format &rest args)
+ (when (eval-when-compile 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
+ (delq nil (mapcar #'(lambda (jump)
+ (let* ((mark (car jump))
+ (pos (if (markerp mark)
+ (marker-position mark)
+ mark))
+ (file-name (cadr jump)))
+ (when (and (not (file-remote-p file-name))
+ (file-exists-p file-name)
+ pos)
+ (list pos file-name))))
+ (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)
+ (unless (string= current-file-name file-name)
+ (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."
+ (save-excursion
+ (when (markerp pos)
+ (set-buffer (marker-buffer pos)))
+
+ (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))
+ (when pos
+ (goto-char pos))
+ (evil--jumps-push))))
+
+(defun evil--jump-backward (count)
+ (setq evil--jumps-jumping-backward t)
+ (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
+ (ring-length (evil--jumps-get-jumps target-jump-struct)))
+ (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-previous-pos target-jump-struct) (evil-jumps-struct-previous-pos source-jump-struct))
+ (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)
+ "`pre-command-hook' for evil-jumps.
+Set jump point if COMMAND has a non-nil `:jump' property. Otherwise,
+save the current position in case the command being executed will
+change the current buffer."
+ (setq command (or command this-command))
+ (if (evil-get-command-property command :jump)
+ (evil-set-jump)
+ (setf (evil-jumps-struct-previous-pos (evil--jumps-get-current))
+ (point-marker))))
+
+(defun evil--jump-handle-buffer-crossing ()
+ (let ((jumping-backward evil--jumps-jumping-backward))
+ (setq evil--jumps-jumping-backward nil)
+ (dolist (frame (frame-list))
+ (dolist (window (window-list frame))
+ (let* ((struct (evil--jumps-get-current window))
+ (previous-pos (evil-jumps-struct-previous-pos struct)))
+ (when previous-pos
+ (setf (evil-jumps-struct-previous-pos struct) nil)
+ (if (and
+ ;; `evil-jump-backward' (and other backward jumping
+ ;; commands) needs to be handled specially. When
+ ;; jumping backward multiple times, calling
+ ;; `evil-set-jump' is always wrong: If you jump back
+ ;; twice and we call `evil-set-jump' after the second
+ ;; time, we clear the forward jump list and
+ ;; `evil--jump-forward' won't work.
+
+ ;; The first time you jump backward, setting a jump
+ ;; point is sometimes correct. But we don't do it
+ ;; here because this function is called after
+ ;; `evil--jump-backward' has updated our position in
+ ;; the jump list so, again, `evil-set-jump' would
+ ;; break `evil--jump-forward'.
+ (not jumping-backward)
+ (let ((previous-buffer (marker-buffer previous-pos)))
+ (and previous-buffer
+ (not (eq previous-buffer (window-buffer window))))))
+ (evil-set-jump previous-pos)
+ (set-marker previous-pos nil))))))))
+
+(if (bound-and-true-p savehist-loaded)
+ (evil--jumps-savehist-load)
+ (add-hook 'savehist-mode-hook #'evil--jumps-savehist-load))
+
+(defun evil--jumps-install-or-uninstall ()
+ (if evil-local-mode
+ (progn
+ (add-hook 'pre-command-hook #'evil--jump-hook nil t)
+ (add-hook 'post-command-hook #'evil--jump-handle-buffer-crossing 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))
+ (remove-hook 'pre-command-hook #'evil--jump-hook t)
+ (remove-hook 'post-command-hook #'evil--jump-handle-buffer-crossing t)
+ (remove-hook 'next-error-hook #'evil-set-jump t)
+ (remove-hook 'window-configuration-change-hook #'evil--jumps-window-configuration-hook t)
+ (evil--jump-handle-buffer-crossing)))
+
+(add-hook 'evil-local-mode-hook #'evil--jumps-install-or-uninstall)
+
+(provide 'evil-jumps)
+
+;;; evil-jumps.el ends here
diff --git a/elpa/evil-1.15.0/evil-jumps.elc b/elpa/evil-1.15.0/evil-jumps.elc
new file mode 100644
index 0000000..012dce5
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-jumps.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-keybindings.el b/elpa/evil-1.15.0/evil-keybindings.el
new file mode 100644
index 0000000..baafaf8
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-keybindings.el
@@ -0,0 +1,124 @@
+;;; 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.15.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-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-1.15.0/evil-keybindings.elc b/elpa/evil-1.15.0/evil-keybindings.elc
new file mode 100644
index 0000000..0d80f7f
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-keybindings.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-macros.el b/elpa/evil-1.15.0/evil-macros.el
new file mode 100644
index 0000000..71bf122
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-macros.el
@@ -0,0 +1,817 @@
+;;; 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.15.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.
+- `:restore-point' - if non-nil, point is restored when the
+ operator is executed from ex.
+
+\(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)
+ (setq evil-operator-start-col (current-column))
+ (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-1.15.0/evil-macros.elc b/elpa/evil-1.15.0/evil-macros.elc
new file mode 100644
index 0000000..2d694c4
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-macros.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-maps.el b/elpa/evil-1.15.0/evil-maps.el
new file mode 100644
index 0000000..2166d9a
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-maps.el
@@ -0,0 +1,643 @@
+;;; 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.15.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 "gI" 'evil-insert-0-line)
+(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 "]f" 'find-file-at-point)
+(define-key evil-normal-state-map "[f" 'find-file-at-point)
+(define-key evil-normal-state-map "gF" 'evil-find-file-at-point-with-line)
+(define-key evil-normal-state-map "]F" 'evil-find-file-at-point-with-line)
+(define-key evil-normal-state-map "[F" '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" 'evil-undo)
+(define-key evil-normal-state-map "\C-r" 'evil-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
+(define-key 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 (vconcat "g" [down]) 'evil-next-visual-line)
+(define-key evil-motion-state-map "gk" 'evil-previous-visual-line)
+(define-key evil-motion-state-map (vconcat "g" [up]) '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 (vconcat "g" [home]) '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 "gM" 'evil-percentage-of-line)
+(define-key evil-motion-state-map "go" 'evil-goto-char)
+(define-key evil-motion-state-map "g$" 'evil-end-of-visual-line)
+(define-key evil-motion-state-map (vconcat "g" [end]) '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 [end] 'evil-end-of-line)
+(define-key evil-motion-state-map [home] 'evil-beginning-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 "]'" 'evil-next-mark-line)
+(define-key evil-motion-state-map "]`" 'evil-next-mark)
+(define-key evil-motion-state-map "['" 'evil-previous-mark-line)
+(define-key evil-motion-state-map "[`" 'evil-previous-mark)
+(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-whole-line)
+(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)
+(define-key evil-visual-state-map "gf" 'evil-find-file-at-point-visual)
+
+;;; 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
+ `(([insert] . evil-replace-state)
+ ("\C-q" . evil-quoted-insert)
+ ("\C-v" . evil-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) ;; Completion commands
+ ("\C-p" . evil-complete-previous) ;; don't yet behave correctly
+ ("\C-x\C-n" . evil-complete-next-line) ;; in replace state
+ ("\C-x\C-p" . evil-complete-previous-line) ;; TODO - fix this
+ ("\C-t" . evil-shift-right-line)
+ ("\C-d" . evil-shift-left-line)
+ ("\C-a" . evil-paste-last-insertion)
+ ("\C-@" . evil-paste-last-insertion-and-stop-insert)
+ ([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)))
+ ,@(when evil-want-C-h-delete
+ '(("\C-h" . evil-delete-backward-char-and-join)))
+ ([mouse-2] . mouse-yank-primary))
+ "Evil's bindings for insert & replace states.
+Used in `evil-insert-state-map' and `evil-replace-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
+
+(dolist (binding evil-insert-state-bindings)
+ (define-key evil-replace-state-map (car binding) (cdr binding)))
+(define-key evil-replace-state-map (kbd "DEL") 'evil-replace-backspace)
+(when evil-want-C-h-delete
+ (define-key evil-replace-state-map "\C-h" 'evil-replace-backspace))
+(define-key evil-replace-state-map [escape] 'evil-normal-state)
+(define-key evil-replace-state-map [insert] 'evil-append)
+
+;;; 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 "up[date]" 'evil-update)
+(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 "pu[t]" 'evil-ex-put)
+(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 "di[splay]" "registers")
+(evil-ex-define-cmd "ma[rk]" 'evil-set-col-0-mark)
+(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)
+(evil-ex-define-cmd "u[ndo]" 'evil-undo)
+(evil-ex-define-cmd "red[o]" 'evil-redo)
+
+(when (featurep 'tab-bar)
+ (evil-ex-define-cmd "tabnew" 'tab-bar-new-tab)
+ (evil-ex-define-cmd "tabc[lose]" 'tab-bar-close-tab)
+ (evil-ex-define-cmd "tabo[nly]" 'tab-bar-close-other-tabs)
+ (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-b" 'move-beginning-of-line)
+(define-key evil-ex-search-keymap "\C-c" 'abort-recursive-edit)
+(define-key evil-ex-search-keymap "\C-g" 'abort-recursive-edit)
+(define-key evil-ex-search-keymap "\C-k" 'evil-insert-digraph)
+(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)
+(define-key evil-ex-search-keymap "\C-u" 'evil-delete-whole-line)
+(define-key evil-ex-search-keymap "\C-v" #'quoted-insert)
+(define-key evil-ex-search-keymap "\C-w" 'backward-kill-word)
+
+;; 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)
+
+;; eval prompt (the `=' register)
+(define-key evil-eval-map "\C-b" 'move-beginning-of-line)
+(define-key evil-eval-map "\C-c" 'abort-recursive-edit)
+(define-key evil-eval-map "\C-g" 'abort-recursive-edit)
+(define-key evil-eval-map "\C-k" 'evil-insert-digraph)
+(define-key evil-eval-map "\C-p" #'previous-complete-history-element)
+(define-key evil-eval-map "\C-r" 'evil-paste-from-register)
+(define-key evil-eval-map "\C-n" #'next-complete-history-element)
+(define-key evil-eval-map "\C-u" 'evil-delete-whole-line)
+(define-key evil-eval-map "\C-v" #'quoted-insert)
+(define-key evil-eval-map "\C-w" 'backward-kill-word)
+(define-key evil-eval-map [escape] 'abort-recursive-edit)
+(define-key evil-eval-map [S-left] 'backward-word)
+(define-key evil-eval-map [S-right] 'forward-word)
+(define-key evil-eval-map [up] 'previous-complete-history-element)
+(define-key evil-eval-map [down] 'next-complete-history-element)
+(define-key evil-eval-map [prior] 'previous-history-element)
+(define-key evil-eval-map [next] 'next-history-element)
+(define-key evil-eval-map [return] 'exit-minibuffer)
+(define-key evil-eval-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-1.15.0/evil-maps.elc b/elpa/evil-1.15.0/evil-maps.elc
new file mode 100644
index 0000000..95c5d64
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-maps.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-pkg.el b/elpa/evil-1.15.0/evil-pkg.el
new file mode 100644
index 0000000..6f2ace0
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-pkg.el
@@ -0,0 +1,2 @@
+;; Generated package description from evil.el -*- no-byte-compile: t -*-
+(define-package "evil" "1.15.0" "extensible vi layer" 'nil :commit "008a6cdb12f15e748979a7d1c2f26c34c84dedbf" :maintainer '("Tom Dalziel" . "tom.dalziel@gmail.com") :keywords '("emulation" "vim") :url "https://github.com/emacs-evil/evil")
diff --git a/elpa/evil-1.15.0/evil-repeat.el b/elpa/evil-1.15.0/evil-repeat.el
new file mode 100644
index 0000000..f305704
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-repeat.el
@@ -0,0 +1,646 @@
+;;; 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.15.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 to be executed (in pre-command-hook) or normal
+;; state is exited. The recording is stopped whenever a command has
+;; been 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 switch 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.
+For example `mouse-yank-primary'. 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)))))
+
+;; Keep the compiler happy - this is a buffer local var
+(defvar evil--execute-normal-return-state)
+
+(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 ((evil-last-find-temp evil-last-find)
+ (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))
+ (setq evil-last-find evil-last-find-temp)))
+ (if (eq 'evil-execute-in-normal-state last-command)
+ (evil-change-state evil--execute-normal-return-state)
+ (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-1.15.0/evil-repeat.elc b/elpa/evil-1.15.0/evil-repeat.elc
new file mode 100644
index 0000000..9a7bf68
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-repeat.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-search.el b/elpa/evil-1.15.0/evil-search.el
new file mode 100644
index 0000000..0cc9c1b
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-search.el
@@ -0,0 +1,1336 @@
+;;; 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.15.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. May be either `isearch', for
+Emacs' isearch module, or `evil-search', for Evil's own
+interactive search module. N.b. changing this will not affect keybindings.
+To swap out relevant keybindings, see `evil-select-search-module' function."
+ :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))
+ (when evil-search-wrap-ring-bell (ding))
+ (setq string "Search wrapped around BOTTOM of buffer"))
+ ((and (not forward) (> (point) start))
+ (when evil-search-wrap-ring-bell (ding))
+ (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 (and evil-ex-search-vim-style-regexp
+ (not (or (string-match-p "\\`\\\\_?<" regexp)
+ (string-match-p "\\\\_?>\\'" 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)
+ (when evil-ex-search-incremental
+ (add-hook 'after-change-functions #'evil-ex-search-update-pattern nil t))
+ (add-hook 'minibuffer-exit-hook #'evil-ex-search-stop-session)
+ (add-hook 'mouse-leave-buffer-hook #'evil-ex-search-exit)
+ (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 'mouse-leave-buffer-hook #'evil-ex-search-exit)
+ (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))
+ (orig-pat pat))
+ ;; use last pattern if 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 (new-dir repeat-last 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)))
+ ;; single `?' or `/' means repeat last pattern and finish
+ ((= 1 (length next-pat))
+ (evil-ex-search-goto-offset offset)
+ (setq new-dir (if (string= "/" next-pat) 'forward 'backward)
+ count (if (eq direction new-dir) 1 2)
+ pattern-string orig-pat
+ direction new-dir))
+ ;; next non-empty pattern, next search iteration
+ (t
+ (evil-ex-search-goto-offset offset)
+ (setq new-dir (if (= (aref next-pat 0) ?/) 'forward 'backward)
+ repeat-last (and (<= 2 (length next-pat))
+ (member (substring next-pat 0 2) '("//" "??")))
+ count (if (or (eq direction new-dir) (not repeat-last)) 1 2)
+ pattern-string (if repeat-last
+ (concat orig-pat (substring next-pat 1))
+ (substring next-pat 1))
+ direction new-dir))))))))
+
+(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 (if (eq evil-ex-search-direction 'forward)
+ (1+ evil-ex-search-start-point)
+ (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))
+ (when (and (not evil-ex-search-incremental) evil-ex-search-highlight-all)
+ (evil-ex-search-activate-highlight pattern))
+ (when (and evil-ex-search-incremental (not 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
+ (let (evil-ex-search-vim-style-regexp)
+ (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-1.15.0/evil-search.elc b/elpa/evil-1.15.0/evil-search.elc
new file mode 100644
index 0000000..8d31757
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-search.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-states.el b/elpa/evil-1.15.0/evil-states.el
new file mode 100644
index 0000000..a2e0e6e
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-states.el
@@ -0,0 +1,937 @@
+;;; 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.15.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
+ evil-change-whole-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 of BUFFER."
+ (let ((buf (or buffer (current-buffer))))
+ (when (and evil-visual-update-x-selection-p
+ (buffer-live-p buf)
+ (evil-visual-state-p)
+ (display-selections-p)
+ (not (eq evil-visual-selection 'block)))
+ (with-current-buffer buf
+ (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))))))
+
+(defun evil-update-replace-alist (opoint count chars-to-delete &optional offset)
+ "Add CHARS-TO-DELETE chars to evil-replace-alist, starting at OPOINT.
+If COUNT is greater than CHARS-TO-DELETE, pad the alist with nils.
+Decrement recorded position by optional offset, or 0."
+ (when (evil-replace-state-p)
+ (dotimes (c count)
+ (let ((pos (+ c opoint)))
+ (add-to-list 'evil-replace-alist
+ (cons (- pos (or offset 0)) (when (< c chars-to-delete)
+ (char-after pos))))))))
+
+;;; 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-1.15.0/evil-states.elc b/elpa/evil-1.15.0/evil-states.elc
new file mode 100644
index 0000000..58afd70
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-states.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-test-helpers.el b/elpa/evil-1.15.0/evil-test-helpers.el
new file mode 100644
index 0000000..7d67c56
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-test-helpers.el
@@ -0,0 +1,418 @@
+;;; evil-test-helpers.el --- unit test helpers for Evil -*- coding: utf-8; lexical-binding: t -*-
+
+;; Author: Vegard Øye <vegard_oye at hotmail.com>
+;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
+;; Package-Requires: ((evil "1.15.0"))
+;; Version: 1.15.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 file contains helper functions for writing tests for
+;; evil-mode. These helpers can also be used by other packages which
+;; extend evil-mode.
+
+;; To write a test use `evil-test-buffer':
+
+;; (require 'evil-test-helpers)
+;;
+;; (ert-deftest evil-test ()
+;; :tags '(evil)
+;; (evil-test-buffer
+;; "[T]his creates a test buffer." ; cursor on "T"
+;; ("w") ; key sequence
+;; "This [c]reates a test buffer."))) ; cursor moved to "c"
+;;
+;; The initial state, the cursor syntax, etc., can be changed
+;; with keyword arguments. See the documentation string of
+;; `evil-test-buffer' for more details.
+;;
+;; This file is NOT part of Evil itself.
+
+(require 'elp)
+(require 'ert)
+(require 'evil)
+
+;;; Code:
+
+(when (fboundp 'font-lock-add-keywords)
+ (font-lock-add-keywords 'emacs-lisp-mode
+ '(("(\\(evil-test-buffer\\)\\>"
+ 1 font-lock-keyword-face))))
+
+(defvar evil-test-point nil
+ "Marker for point.")
+(make-variable-buffer-local 'evil-test-point)
+(defvar evil-test-visual-start nil
+ "Marker for Visual beginning.")
+(make-variable-buffer-local 'evil-test-visual-start)
+(defvar evil-test-visual-end nil
+ "Marker for Visual end.")
+(make-variable-buffer-local 'evil-test-visual-end)
+
+(defvaralias 'evil-test-select-enable-clipboard
+ (if (boundp 'select-enable-clipboard)
+ 'select-enable-clipboard
+ 'x-select-enable-clipboard))
+
+(defmacro evil-test-buffer (&rest body)
+ "Execute FORMS in a temporary buffer.
+The following optional keywords specify the buffer's properties:
+
+:state STATE The initial state, defaults to `normal'.
+:visual SELECTION The Visual selection, defaults to `char'.
+:point-start STRING String for matching beginning of point,
+ defaults to \"[\".
+:point-end STRING String for matching end of point,
+ defaults to \"]\".
+:visual-start STRING String for matching beginning of
+ Visual selection, defaults to \"<\".
+:visual-end STRING String for matching end of
+ Visual selection, defaults to \">\".
+
+Then follows one or more forms. If the first form is a string,
+it is taken to be a buffer description as passed to
+`evil-test-buffer-from-string', and initializes the buffer.
+Subsequent string forms validate the buffer.
+
+If a form is a list of strings or vectors, it is taken to be a
+key sequence and is passed to `execute-kbd-macro'. If the form
+is \(file FILENAME CONTENTS), then the test fails unless the
+contents of FILENAME equal CONTENTS. If the form is \(error
+SYMBOL ...) then the test fails unless an error of type SYMBOL is
+raised. Remaining forms are evaluated as-is.
+
+\(fn [[KEY VALUE]...] FORMS...)"
+ (declare (indent defun))
+ (let ((state 'normal)
+ arg key point-start point-end string
+ visual visual-start visual-end)
+ ;; collect keywords
+ (while (keywordp (car-safe body))
+ (setq key (pop body)
+ arg (pop body))
+ (cond
+ ((eq key :point-start)
+ (setq point-start (or arg "")))
+ ((eq key :point-end)
+ (setq point-end (or arg "")))
+ ((eq key :state)
+ (setq state arg))
+ ((eq key :visual)
+ (setq visual arg))
+ ((eq key :visual-start)
+ (setq visual-start (or arg "")))
+ ((eq key :visual-end)
+ (setq visual-end (or arg "")))))
+ ;; collect buffer initialization
+ (when (stringp (car-safe body))
+ (setq string (pop body)))
+ ;; macro expansion
+ `(let ((buffer (evil-test-buffer-from-string
+ ,string ',state
+ ,point-start ,point-end
+ ',visual ,visual-start ,visual-end))
+ (kill-ring kill-ring)
+ (kill-ring-yank-pointer kill-ring-yank-pointer)
+ evil-test-select-enable-clipboard
+ message-log-max)
+ (unwind-protect
+ (save-window-excursion
+ (with-current-buffer buffer
+ ;; necessary for keyboard macros to work
+ (switch-to-buffer-other-window (current-buffer))
+ (buffer-enable-undo)
+ ;; parse remaining forms
+ ,@(mapcar
+ #'(lambda (form)
+ (let (error-symbol)
+ (when (and (listp form)
+ (eq (car-safe form) 'error))
+ (setq error-symbol (car-safe (cdr-safe form))
+ form (cdr-safe (cdr-safe form))))
+ (let ((result
+ (cond
+ ((stringp form)
+ `(evil-test-buffer-string
+ ,form
+ ',point-start ',point-end
+ ',visual-start ',visual-end))
+ ((eq (car-safe form) 'file)
+ `(evil-test-file-contents ,(cadr form)
+ ,(car (cddr form))))
+ ((or (stringp (car-safe form))
+ (vectorp (car-safe form))
+ (memq (car-safe (car-safe form))
+ '(kbd vconcat)))
+ ;; we need to execute everything as a single
+ ;; sequence for command loop hooks to work
+ `(execute-kbd-macro
+ (apply #'vconcat
+ (mapcar #'listify-key-sequence
+ (mapcar #'eval ',form)))))
+ ((memq (car-safe form) '(kbd vconcat))
+ `(execute-kbd-macro ,form))
+ (t
+ form))))
+ (if error-symbol
+ `(should-error ,result :type ',error-symbol)
+ result))))
+ body)))
+ (and (buffer-name buffer)
+ (kill-buffer buffer))))))
+
+(defmacro evil-test-selection (string &optional end-string
+ before-predicate after-predicate)
+ "Verify that the Visual selection contains STRING."
+ (declare (indent defun))
+ `(progn
+ (save-excursion
+ (goto-char (or evil-visual-beginning (region-beginning)))
+ (evil-test-text nil (or ,string ,end-string) ,before-predicate))
+ (save-excursion
+ (goto-char (or evil-visual-end (region-end)))
+ (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
+
+(defun evil-test-buffer-string (string &optional
+ point-start point-end
+ visual-start visual-end)
+ "Validate the current buffer according to STRING.
+If STRING contains an occurrence of POINT-START immediately
+followed by POINT-END, that position is compared against point.
+If STRING contains an occurrence of VISUAL-START followed by
+VISUAL-END, those positions are compared against the Visual selection.
+POINT-START and POINT-END default to [ and ].
+VISUAL-START and VISUAL-END default to < and >."
+ (let ((actual-buffer (current-buffer))
+ (marker-buffer (evil-test-marker-buffer-from-string
+ string
+ point-start point-end
+ visual-start visual-end))
+ before-point after-point string selection)
+ (unwind-protect
+ (with-current-buffer marker-buffer
+ (setq string (buffer-string))
+ (when evil-test-point
+ (setq before-point (buffer-substring (point-min) evil-test-point)
+ after-point (buffer-substring evil-test-point (point-max))))
+ (when (and evil-test-visual-start evil-test-visual-end)
+ (setq selection (buffer-substring
+ evil-test-visual-start evil-test-visual-end)))
+ (with-current-buffer actual-buffer
+ (if (or before-point after-point)
+ (evil-test-text before-point after-point)
+ ;; if the cursor isn't specified, just test the whole buffer
+ (save-excursion
+ (goto-char (point-min))
+ (evil-test-text nil string #'bobp #'eobp)))
+ (when selection
+ (evil-test-selection selection))))
+ (kill-buffer marker-buffer))))
+
+(defun evil-test-buffer-from-string (string &optional
+ state
+ point-start point-end
+ visual visual-start visual-end)
+ "Create a new buffer according to STRING.
+If STRING contains an occurrence of POINT-START immediately
+followed by POINT-END, then point is moved to that position.
+If STRING contains an occurrence of VISUAL-START followed by
+VISUAL-END, then a Visual selection is created with those boundaries.
+POINT-START and POINT-END default to [ and ].
+VISUAL-START and VISUAL-END default to < and >.
+STATE is the initial state; it defaults to `normal'.
+VISUAL is the Visual selection: it defaults to `char'."
+ (let ((type (evil-visual-type (or visual 'char)))
+ (buffer (evil-test-marker-buffer-from-string
+ string point-start point-end
+ visual-start visual-end)))
+ (with-current-buffer buffer
+ (prog1 buffer
+ (evil-change-state state)
+ ;; let the buffer change its major mode without disabling Evil
+ (add-hook 'after-change-major-mode-hook #'evil-initialize)
+ (when (and (markerp evil-test-visual-start)
+ (markerp evil-test-visual-end))
+ (evil-visual-select
+ evil-test-visual-start evil-test-visual-end type)
+ (when evil-test-point
+ (goto-char evil-test-point)
+ (evil-visual-refresh)
+ (unless (and (= evil-visual-beginning
+ evil-test-visual-start)
+ (= evil-visual-end
+ evil-test-visual-end))
+ (evil-visual-select
+ evil-test-visual-start evil-test-visual-end type -1)
+ (goto-char evil-test-point)
+ (evil-visual-refresh))))
+ (when (markerp evil-test-point)
+ (goto-char evil-test-point))))))
+
+(defun evil-test-marker-buffer-from-string (string &optional
+ point-start point-end
+ visual-start visual-end)
+ "Create a new marker buffer according to STRING.
+If STRING contains an occurrence of POINT-START immediately
+followed by POINT-END, that position is stored in the
+buffer-local variable `evil-test-point'. Similarly,
+if STRING contains an occurrence of VISUAL-START followed by
+VISUAL-END, those positions are stored in the variables
+`evil-test-visual-beginning' and `evil-test-visual-end'.
+POINT-START and POINT-END default to [ and ].
+VISUAL-START and VISUAL-END default to < and >."
+ (let ((string (or string ""))
+ (point-start (regexp-quote
+ (if (characterp point-start)
+ (string point-start)
+ (or point-start "["))))
+ (point-end (regexp-quote
+ (if (characterp point-end)
+ (string point-end)
+ (or point-end "]"))))
+ (visual-start (regexp-quote
+ (if (characterp visual-start)
+ (string visual-start)
+ (or visual-start "<"))))
+ (visual-end (regexp-quote
+ (if (characterp visual-end)
+ (string visual-end)
+ (or visual-end ">")))))
+ (with-current-buffer (generate-new-buffer " *test*")
+ (prog1 (current-buffer)
+ (save-excursion
+ (insert string))
+ (save-excursion
+ (when (> (length point-start) 0)
+ (if (> (length point-end) 0)
+ (when (re-search-forward
+ (format "\\(%s\\)[^%s]?\\(%s\\)"
+ point-start point-end point-end) nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (match-beginning 2) (match-end 2))
+ (delete-region (match-beginning 1) (match-end 1))
+ (setq evil-test-point
+ (move-marker (make-marker) (point))))
+ (when (re-search-forward point-start nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (match-beginning 0) (match-end 0))
+ (setq evil-test-point
+ (move-marker (make-marker) (point)))))))
+ (save-excursion
+ (when (and (> (length visual-start) 0)
+ (> (length visual-end) 0))
+ (when (re-search-forward visual-start nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (match-beginning 0) (match-end 0))
+ (setq evil-test-visual-start
+ (move-marker (make-marker) (point))))
+ (when (re-search-forward visual-end nil t)
+ (goto-char (match-beginning 0))
+ (delete-region (match-beginning 0) (match-end 0))
+ (setq evil-test-visual-end
+ (move-marker (make-marker) (point))))))))))
+
+(defun evil-test-text (before after &optional before-predicate after-predicate)
+ "Verify the text around point.
+BEFORE is the expected text before point, and AFTER is
+the text after point. BEFORE-PREDICATE is a predicate function
+to execute at the beginning of the text, and AFTER-PREDICATE
+is executed at the end."
+ (when before
+ (if (functionp before)
+ (setq before-predicate before
+ before nil)
+ (should (string= (buffer-substring
+ (max (point-min) (- (point) (length before)))
+ (point))
+ before))))
+ (when after
+ (if (functionp after)
+ (setq after-predicate after
+ after nil)
+ (should (string= (buffer-substring
+ (point)
+ (min (point-max) (+ (point) (length after))))
+ after))))
+ (when before-predicate
+ (ert-info ((format "Expect `%s' at the beginning" before-predicate))
+ (save-excursion
+ (backward-char (length before))
+ (should (funcall before-predicate)))))
+ (when after-predicate
+ (ert-info ((format "Expect `%s' at the end" after-predicate))
+ (save-excursion
+ (forward-char (length after))
+ (should (funcall after-predicate))))))
+
+(defmacro evil-test-region (string &optional end-string
+ before-predicate after-predicate)
+ "Verify that the region contains STRING."
+ (declare (indent defun))
+ `(progn
+ (save-excursion
+ (goto-char (region-beginning))
+ (evil-test-text nil (or ,string ,end-string) ,before-predicate))
+ (save-excursion
+ (goto-char (region-end))
+ (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
+
+(defmacro evil-test-overlay (overlay string &optional end-string
+ before-predicate after-predicate)
+ "Verify that OVERLAY contains STRING."
+ (declare (indent defun))
+ `(progn
+ (save-excursion
+ (goto-char (overlay-start ,overlay))
+ (evil-test-text nil (or ,string ,end-string) ,before-predicate))
+ (save-excursion
+ (goto-char (overlay-end ,overlay))
+ (evil-test-text (or ,end-string ,string) nil nil ,after-predicate))))
+
+(defmacro evil-with-temp-file (file-var content &rest body)
+ "Create a temp file with CONTENT and bind its name to FILE-VAR within BODY.
+FILE-VAR must be a symbol which contains the name of the
+temporary file within the macro body. CONTENT is either a string
+to be used as the content of the temporary file or a form to be
+executed with the temporary file's buffer as \(current-buffer),
+see `with-temp-file'. BODY contains the forms to be executed
+while the temporary file exists. The temporary file is deleted at
+the end of the execution of BODY."
+ (declare (indent 2)
+ (debug (symbolp form body)))
+ `(let ((,file-var (make-temp-file "evil-test")))
+ (with-temp-file ,file-var
+ ,(if (stringp content)
+ `(insert ,content)
+ content))
+ ,@body
+ (delete-file ,file-var)))
+
+(defun evil-test-file-contents (name contents)
+ "Ensure that the contents of file with NAME equal CONTENTS."
+ (with-temp-buffer
+ (insert-file-contents name)
+ (should (string= (buffer-string)
+ contents))))
+
+(provide 'evil-test-helpers)
+
+;;; evil-test-helpers.el ends here
diff --git a/elpa/evil-1.15.0/evil-test-helpers.elc b/elpa/evil-1.15.0/evil-test-helpers.elc
new file mode 100644
index 0000000..64753ab
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-test-helpers.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-tests.el b/elpa/evil-1.15.0/evil-tests.el
new file mode 100644
index 0000000..ff896a5
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-tests.el
@@ -0,0 +1,9386 @@
+;; evil-tests.el --- unit tests for Evil -*- coding: utf-8 -*-
+
+;; Author: Vegard Øye <vegard_oye at hotmail.com>
+;; Maintainer: Vegard Øye <vegard_oye at hotmail.com>
+
+;; Version: 1.15.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 file is for developers. It runs some tests on Evil.
+;; To load it, run the Makefile target "make test" or add
+;; the following lines to .emacs:
+;;
+;; (setq evil-tests-run nil) ; set to t to run tests immediately
+;; (global-set-key [f12] 'evil-tests-run) ; hotkey
+;; (require 'evil-tests)
+;;
+;; Loading this file enables profiling on Evil. The current numbers
+;; can be displayed with `elp-results'. The Makefile target
+;; "make profiler" shows profiling results in the terminal on the
+;; basis of running all tests.
+;;
+;; To write a test, use `ert-deftest' and specify a :tags value of at
+;; least '(evil). The test may inspect the output of functions given
+;; certain input, or it may execute a key sequence in a temporary
+;; buffer and investigate the results. For the latter approach, the
+;; macro `evil-test-buffer' creates a temporary buffer in Normal
+;; state. String descriptors initialize and match the contents of
+;; the buffer:
+;;
+;; (ert-deftest evil-test ()
+;; :tags '(evil)
+;; (evil-test-buffer
+;; "[T]his creates a test buffer." ; cursor on "T"
+;; ("w") ; key sequence
+;; "This [c]reates a test buffer."))) ; cursor moved to "c"
+;;
+;; The initial state, the cursor syntax, etc., can be changed
+;; with keyword arguments. See the documentation string of
+;; `evil-test-buffer' for more details.
+;;
+;; This file is NOT part of Evil itself.
+
+(require 'cl-lib)
+(require 'elp)
+(require 'ert)
+(require 'evil)
+(require 'evil-test-helpers)
+
+;;; Code:
+
+(defvar evil-tests-run nil
+ "*Run Evil tests.")
+
+(defvar evil-tests-profiler nil
+ "*Profile Evil tests.")
+
+(defun evil-tests-initialize (&optional tests profiler interactive)
+ (setq profiler (or profiler evil-tests-profiler))
+ (when (listp profiler)
+ (setq profiler (car profiler)))
+ (when profiler
+ (setq evil-tests-profiler t)
+ (setq profiler
+ (or (cdr (assq profiler
+ '((call . elp-sort-by-call-count)
+ (average . elp-sort-by-average-time)
+ (total . elp-sort-by-total-time))))))
+ (setq elp-sort-by-function (or profiler 'elp-sort-by-call-count))
+ (elp-instrument-package "evil"))
+ (if interactive
+ (if (y-or-n-p-with-timeout "Run tests? " 2 t)
+ (evil-tests-run tests interactive)
+ (message "You can run the tests at any time \
+with `M-x evil-tests-run'"))
+ (evil-tests-run tests)))
+
+(defun evil-tests-run (&optional tests interactive)
+ "Run Evil tests."
+ (interactive '(nil t))
+ (let ((elp-use-standard-output (not interactive)))
+ (setq tests
+ (or (null tests)
+ `(or ,@(mapcar #'(lambda (test)
+ (or (null test)
+ (and (memq test '(evil t)) t)
+ `(or (tag ,test)
+ ,(format "^%s$" test))))
+ tests))))
+ (cond
+ (interactive
+ (ert-run-tests-interactively tests)
+ (when evil-tests-profiler
+ (elp-results)))
+ (evil-tests-profiler
+ (ert-run-tests-batch tests)
+ (elp-results))
+ (t
+ ;; We would like to use `ert-run-tests-batch-and-exit'
+ ;; Unfortunately it doesn't work outside of batch mode, and we
+ ;; can't use batch mode because we have tests that need windows.
+ ;; Instead, run the tests interactively, copy the results to a
+ ;; text file, and then exit with an appropriate code.
+ (setq attempt-stack-overflow-recovery nil
+ attempt-orderly-shutdown-on-fatal-signal nil)
+ (unwind-protect
+ (progn
+ (ert-run-tests-interactively tests)
+ (with-current-buffer "*ert*"
+ (append-to-file (point-min) (point-max) "test-results.txt")
+ (kill-emacs (if (zerop (ert-stats-completed-unexpected ert--results-stats)) 0 1))))
+ (unwind-protect
+ (progn
+ (append-to-file "Error running tests\n" nil "test-results.txt")
+ (append-to-file (backtrace-to-string (backtrace-get-frames 'backtrace)) nil "test-results.txt"))
+ (kill-emacs 2)))))))
+
+(defun evil-tests-profiler (&optional force)
+ "Profile Evil tests."
+ (when (or evil-tests-profiler force)
+ (setq evil-tests-profiler t)
+ (elp-instrument-package "evil")))
+
+;;; States
+
+(defun evil-test-local-mode-enabled ()
+ "Verify that `evil-local-mode' is enabled properly"
+ (ert-info ("Set the mode variable to t")
+ (should (eq evil-local-mode t)))
+ (ert-info ("Refresh `emulation-mode-map-alist'")
+ (should (memq 'evil-mode-map-alist emulation-mode-map-alists)))
+ (ert-info ("Create a buffer-local value for `evil-mode-map-alist'")
+ (should (assq 'evil-mode-map-alist (buffer-local-variables))))
+ (ert-info ("Initialize buffer-local keymaps")
+ (should (assq 'evil-normal-state-local-map (buffer-local-variables)))
+ (should (keymapp evil-normal-state-local-map))
+ (should (assq 'evil-emacs-state-local-map (buffer-local-variables)))
+ (should (keymapp evil-emacs-state-local-map)))
+ (ert-info ("Don't add buffer-local entries to the default value")
+ (should-not (rassq evil-normal-state-local-map
+ (default-value 'evil-mode-map-alist)))
+ (should-not (rassq evil-emacs-state-local-map
+ (default-value 'evil-mode-map-alist)))))
+
+(defun evil-test-local-mode-disabled ()
+ "Verify that `evil-local-mode' is disabled properly"
+ (ert-info ("Set the mode variable to nil")
+ (should-not evil-local-mode))
+ (ert-info ("Disable all states")
+ (evil-test-no-states)))
+
+(defun evil-test-no-states ()
+ "Verify that all states are disabled"
+ (ert-info ("Set `evil-state' to nil")
+ (should-not evil-state))
+ (ert-info ("Disable all state keymaps")
+ (dolist (state (mapcar #'car evil-state-properties) t)
+ (should-not (evil-state-property state :mode t))
+ (should-not (memq (evil-state-property state :keymap t)
+ (current-active-maps)))
+ (should-not (evil-state-property state :local t))
+ (should-not (memq (evil-state-property state :local-keymap t)
+ (current-active-maps)))
+ (dolist (map (evil-state-auxiliary-keymaps state))
+ (should-not (memq map (current-active-maps)))))))
+
+(ert-deftest evil-test-toggle-local-mode ()
+ "Toggle `evil-local-mode'"
+ :tags '(evil state)
+ (with-temp-buffer
+ (ert-info ("Enable `evil-local-mode'")
+ (evil-local-mode 1)
+ (evil-test-local-mode-enabled))
+ (ert-info ("Disable `evil-local-mode'")
+ (evil-local-mode -1)
+ (evil-test-local-mode-disabled))))
+
+(defun evil-test-change-state (state)
+ "Change state to STATE and check keymaps"
+ (let (mode keymap local-mode local-keymap tag)
+ (evil-change-state state)
+ (setq mode (evil-state-property state :mode)
+ keymap (evil-state-property state :keymap t)
+ local-mode (evil-state-property state :local)
+ local-keymap (evil-state-property state :local-keymap t)
+ tag (evil-state-property state :tag t))
+ (when (functionp tag)
+ (setq tag (funcall tag)))
+ (ert-info ("Update `evil-state'")
+ (should (eq evil-state state)))
+ (ert-info ("Ensure `evil-local-mode' is enabled")
+ (evil-test-local-mode-enabled))
+ (ert-info ("Enable state modes")
+ (should (symbol-value mode))
+ (should (symbol-value local-mode)))
+ (ert-info ("Push state keymaps to the top")
+ (evil-test-state-keymaps state))
+ (ert-info ("Refresh mode line tag")
+ (should (equal evil-mode-line-tag tag)))))
+
+(defun evil-test-state-keymaps (state)
+ "Verify that STATE's keymaps are pushed to the top"
+ (let ((actual (evil-state-keymaps state))
+ (expected `((,(evil-state-property state :local)
+ . , (evil-state-property state :local-keymap t))
+ (,(evil-state-property state :mode)
+ . ,(evil-state-property state :keymap t)))))
+ ;; additional keymaps inherited with :enable
+ (cond
+ ((eq state 'operator)
+ (setq expected
+ `((evil-operator-shortcut-mode
+ . ,evil-operator-shortcut-map)
+ (evil-operator-state-local-minor-mode
+ . ,evil-operator-state-local-map)
+ (evil-operator-state-minor-mode
+ . ,evil-operator-state-map)
+ (evil-motion-state-local-minor-mode
+ . ,evil-motion-state-local-map)
+ (evil-motion-state-minor-mode
+ . ,evil-motion-state-map)
+ (evil-normal-state-local-minor-mode
+ . ,evil-normal-state-local-map)
+ (evil-normal-state-minor-mode
+ . ,evil-normal-state-map)))))
+ (let ((actual (butlast actual (- (length actual)
+ (length expected)))))
+ (should (equal actual expected))
+ (dolist (map actual)
+ (setq map (cdr-safe map))
+ (should (keymapp map))))))
+
+(ert-deftest evil-test-exit-normal-state ()
+ "Enter Normal state and then disable all states"
+ :tags '(evil state)
+ (with-temp-buffer
+ (evil-test-change-state 'normal)
+ (evil-normal-state -1)
+ (evil-test-no-states)))
+
+(ert-deftest evil-test-change-states ()
+ "Change between Normal state, Emacs state and Operator-Pending state"
+ :tags '(evil state)
+ (with-temp-buffer
+ (evil-test-change-state 'normal)
+ (evil-test-change-state 'emacs)
+ (evil-test-change-state 'normal)
+ (evil-test-change-state 'operator)
+ (evil-test-change-state 'normal)
+ (evil-test-change-state 'emacs)
+ (evil-test-change-state 'replace)
+ (evil-test-change-state 'normal)))
+
+(ert-deftest evil-test-change-to-previous-state ()
+ "Change to some state and back."
+ :tags '(evil state)
+ (with-temp-buffer
+ (evil-test-change-state 'normal)
+ (evil-test-change-state 'visual)
+ (evil-test-change-state 'emacs)
+ (evil-change-to-previous-state)
+ (should (eq evil-state 'visual))
+ (evil-change-to-previous-state)
+ (should (eq evil-state 'normal))))
+
+(ert-deftest evil-test-enter-normal-state-disabled ()
+ "Enter Normal state even if `evil-local-mode' is disabled"
+ :tags '(evil state)
+ (with-temp-buffer
+ (evil-local-mode -1)
+ (evil-test-local-mode-disabled)
+ (evil-test-change-state 'normal)))
+
+(ert-deftest evil-test-execute-in-normal-state ()
+ "Test `evil-execute-in-normal-state'."
+ :tags '(evil)
+ (ert-info ("Execute normal state command in insert state")
+ (evil-test-buffer
+ "[a]bcdef\n"
+ ("I")
+ (should (evil-insert-state-p))
+ ("\C-ox")
+ (ert-info ("Should return to insert state")
+ (should (evil-insert-state-p)))
+ "[b]cdef\n"
+ ("\C-oA")
+ (ert-info ("Should return to insert state after insert state command")
+ (should (evil-insert-state-p)))
+ ("bcdef[]\n"))
+ (ert-info ("Cursor is placed correctly afterwards")
+ (evil-test-buffer
+ :state insert
+ "abcdefg[]"
+ ("\C-o~")
+ "abcdefG[]")
+ (evil-test-buffer
+ :state insert
+ "abcdefg[]"
+ ("\C-ozz")
+ "abcdefg[]")
+ (evil-test-buffer
+ :state insert
+ "abc[]defg"
+ ("\C-o$")
+ "abcdefg[]")
+ (evil-test-buffer
+ :state insert
+ "abcdefg[]"
+ ("\C-o^")
+ "[]abcdefg")
+ (evil-test-buffer
+ :state insert
+ "abcdefg[]"
+ ("\C-oi")
+ "abcdef[]g")
+ (evil-test-buffer
+ "line1\nli[n]e2"
+ ("ma" "kA" "\C-o`a")
+ "line1\nli[]ne2"))
+ (ert-info ("Can enter replace state and stay in it")
+ (evil-test-buffer
+ :state insert
+ "abc[]defg"
+ ("\C-oRfoo")
+ "abcfoog"))
+ (ert-info ("Insert count is ignored")
+ (evil-test-buffer
+ "[]"
+ ("2i" "abcdef" "\C-o~" "g" [escape])
+ "abcdeF[g]"))
+ (ert-info ("Can execute evil-repeat in normal state")
+ (evil-test-buffer
+ ;; Although this is the same in vim, text inserted after the temporary
+ ;; normal command is not recorded for repetition, which is a subtle
+ ;; (but arguably more useful) difference
+ :state insert
+ "ab[]cfg"
+ ("\C-o~de\C-o.")
+ "abCdeF[]g"))))
+
+(defun evil-test-suppress-keymap (state)
+ "Verify that `self-insert-command' is suppressed in STATE"
+ (evil-test-buffer
+ ";; This buffer is for notes."
+ (evil-test-change-state state)
+ ;; TODO: this should be done better
+ (ert-info ("Disable the state's own keymaps so that the
+suppression keymap comes first")
+ (setq evil-operator-state-minor-mode nil
+ evil-operator-state-local-minor-mode nil))
+ (should (eq (key-binding "Q") #'undefined))
+ (ert-info ("Don't insert text")
+ ;; may or may not signal an error, depending on batch mode
+ (condition-case nil
+ (execute-kbd-macro "QQQ")
+ (error nil))
+ (should (string= (buffer-substring 1 4) ";; ")))))
+
+(ert-deftest evil-test-emacs-state-suppress-keymap ()
+ "`self-insert-command' works in Emacs state"
+ :tags '(evil state)
+ (should-error (evil-test-suppress-keymap 'emacs)))
+
+(ert-deftest evil-test-normal-state-suppress-keymap ()
+ "No `self-insert-command' in Normal state"
+ :tags '(evil state)
+ (evil-test-suppress-keymap 'normal))
+
+(ert-deftest evil-test-operator-state-suppress-keymap ()
+ "Operator-Pending state should inherit suppression
+of `self-insert-command' from Normal state"
+ :tags '(evil state)
+ (evil-test-suppress-keymap 'operator))
+
+(ert-deftest evil-test-operator-state-shortcut-keymap ()
+ "Enable shortcut keymap in Operator-Pending state"
+ :tags '(evil state)
+ (evil-test-buffer
+ (ert-info ("Activate `evil-operator-shortcut-map' in \
+Operator-Pending state")
+ (evil-test-change-state 'operator)
+ (should (rassq evil-operator-shortcut-map
+ (evil-state-keymaps 'operator)))
+ (should (keymapp evil-operator-shortcut-map))
+ (should evil-operator-shortcut-mode)
+ (should (memq evil-operator-shortcut-map
+ (current-active-maps))))
+ (ert-info ("Deactivate `evil-operator-shortcut-map' \
+outside Operator-Pending state")
+ (evil-test-change-state 'emacs)
+ (should-not evil-operator-shortcut-mode)
+ (should-not (memq evil-operator-shortcut-map
+ (current-active-maps))))
+ (ert-info ("Reset `evil-operator-shortcut-map' \
+when entering Operator-Pending state")
+ (define-key evil-operator-shortcut-map "f" 'foo)
+ (should (eq (lookup-key evil-operator-shortcut-map "f")
+ 'foo))
+ (evil-test-change-state 'operator)
+ (should-not (eq (lookup-key evil-operator-shortcut-map "f")
+ 'foo)))
+ (ert-info ("Reset `evil-operator-shortcut-map' \
+when exiting Operator-Pending state")
+ (define-key evil-operator-shortcut-map "b" 'bar)
+ (should (eq (lookup-key evil-operator-shortcut-map "b")
+ 'bar))
+ (evil-test-change-state 'emacs)
+ (should-not (eq (lookup-key evil-operator-shortcut-map "b")
+ 'bar)))))
+
+(ert-deftest evil-test-auxiliary-maps ()
+ "Test auxiliary keymaps"
+ :tags '(evil state)
+ (let ((map (make-sparse-keymap)) aux)
+ (ert-info ("Create a new auxiliary keymap")
+ (evil-define-key 'normal map "f" 'foo)
+ (setq aux (evil-get-auxiliary-keymap map 'normal))
+ (should (evil-auxiliary-keymap-p aux))
+ (should (eq (lookup-key aux "f") 'foo)))
+ (ert-info ("Add to auxiliary keymap")
+ (evil-define-key 'normal map "b" 'bar)
+ (should (eq (lookup-key aux "f") 'foo))
+ (should (eq (lookup-key aux "b") 'bar)))))
+
+(ert-deftest evil-test-global-local-map-binding ()
+ "Test use of `evil-define-key' for binding in global maps."
+ :tags '(evil state)
+ (let ((evil-normal-state-map (copy-keymap evil-normal-state-map))
+ (evil-normal-state-local-map
+ (when (keymapp evil-normal-state-local-map)
+ (copy-keymap evil-normal-state-local-map)))
+ (global-map (copy-keymap global-map))
+ (orig-local-map
+ (when (keymapp (current-local-map))
+ (copy-keymap (current-local-map))))
+ (map (or (current-local-map) (make-sparse-keymap))))
+ (use-local-map map)
+ (ert-info ("Bind in a global state map")
+ (evil-define-key 'normal 'global "f" 'foo)
+ (should (eq (lookup-key evil-normal-state-map "f") 'foo)))
+ (ert-info ("Bind in a local state map")
+ (evil-define-key 'normal 'local "f" 'foo)
+ (should (eq (lookup-key evil-normal-state-local-map "f") 'foo)))
+ (ert-info ("Bind in the global map")
+ (evil-define-key nil 'global "b" 'bar)
+ (should (eq (lookup-key global-map "b") 'bar)))
+ (ert-info ("Bind in the local map")
+ (evil-define-key nil 'local "b" 'bar)
+ (should (eq (lookup-key (current-local-map) "b") 'bar)))
+ (use-local-map orig-local-map)))
+
+;;; Type system
+
+(ert-deftest evil-test-exclusive-type ()
+ "Expand and contract the `line' type"
+ :tags '(evil type)
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (let* ((first-line 1)
+ (second-line (progn
+ (forward-line)
+ (point)))
+ (third-line (progn
+ (forward-line)
+ (point))))
+ (ert-info ("Return the beginning and end unchanged \
+if they are the same")
+ (should (equal (evil-normalize 1 1 'exclusive)
+ (list 1 1 'exclusive))))
+ (ert-info ("expand to `inclusive' if the end position \
+is at the beginning of a line")
+ (should (equal (evil-normalize (1+ first-line) second-line 'exclusive)
+ (list (1+ first-line) (1- second-line) 'inclusive
+ :expanded t))))
+ (ert-info ("expand to `line' if both the beginning and end \
+are at the beginning of a line")
+ (should (equal (evil-normalize first-line second-line 'exclusive)
+ (list first-line second-line 'line
+ :expanded t))))
+ (ert-info ("Measure as the strict difference between the end \
+and the beginning")
+ (should (string= (evil-describe 1 1 'exclusive)
+ "0 characters"))
+ (should (string= (evil-describe 1 2 'exclusive)
+ "1 character"))
+ (should (string= (evil-describe 5 2 'exclusive)
+ "3 characters"))))))
+
+(ert-deftest evil-test-inclusive-type ()
+ "Expand and contract the `inclusive' type"
+ :tags '(evil type)
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (ert-info ("Include the ending character")
+ (should (equal (evil-expand 1 1 'inclusive)
+ '(1 2 inclusive :expanded t))))
+ (ert-info ("Don't mind if positions are in wrong order")
+ (should (equal (evil-expand 5 2 'inclusive)
+ '(2 6 inclusive :expanded t))))
+ (ert-info ("Exclude the ending character when contracting")
+ (should (equal (evil-contract 1 2 'inclusive)
+ '(1 1 inclusive :expanded nil))))
+ (ert-info ("Don't mind positions' order when contracting")
+ (should (equal (evil-contract 6 2 'inclusive)
+ '(2 5 inclusive :expanded nil))))
+ (ert-info ("Measure as one more than the difference")
+ (should (string= (evil-describe 1 1 'inclusive)
+ "1 character"))
+ (should (string= (evil-describe 5 2 'inclusive)
+ "4 characters")))))
+
+(ert-deftest evil-test-line-type ()
+ "Expand the `line' type"
+ :tags '(evil type)
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (let* ((first-line 1)
+ (second-line (progn
+ (forward-line)
+ (point)))
+ (third-line (progn
+ (forward-line)
+ (point))))
+ (ert-info ("Expand to the whole first line")
+ (should (equal (evil-expand first-line first-line 'line)
+ (list first-line second-line 'line :expanded t)))
+ (should (string= (evil-describe first-line first-line 'line)
+ "1 line")))
+ (ert-info ("Expand to the two first lines")
+ (should (equal (evil-expand first-line second-line 'line)
+ (list first-line third-line 'line :expanded t)))
+ (should (string= (evil-describe first-line second-line 'line)
+ "2 lines"))))))
+
+(ert-deftest evil-test-block-type ()
+ "Expand and contract the `block' type"
+ :tags '(evil type)
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (let* ((first-line 1)
+ (second-line (progn
+ (forward-line)
+ (point)))
+ (third-line (progn
+ (forward-line)
+ (point))))
+ (ert-info ("Expand to a 1x1 block")
+ (should (equal (evil-expand 1 1 'block)
+ (list 1 2 'block :expanded t)))
+ (should (string= (evil-describe 1 1 'block)
+ "1 row and 1 column")))
+ (ert-info ("Expand to a 2x1 block")
+ (should (equal (evil-expand first-line second-line 'block)
+ (list first-line (1+ second-line) 'block :expanded t)))
+ (should (string= (evil-describe first-line second-line 'block)
+ "2 rows and 1 column")))
+ (ert-info ("Expand to a 3x2 block")
+ (should (equal (evil-expand first-line (1+ third-line) 'block)
+ (list first-line (1+ (1+ third-line))
+ 'block :expanded t)))
+ (should (string= (evil-describe first-line (1+ third-line) 'block)
+ "3 rows and 2 columns")))
+ (ert-info ("Contract to a 0x0 rectangle")
+ (should (equal (evil-contract 1 2 'block)
+ (list 1 1 'block :expanded nil))))
+ (ert-info ("Contract to a 2x0 rectangle")
+ (should (equal (evil-contract first-line (1+ second-line) 'block)
+ (list first-line second-line 'block :expanded nil))))
+ (ert-info ("Contract to a 3x1 rectangle")
+ (should (equal (evil-contract first-line (1+ (1+ third-line)) 'block)
+ (list first-line (1+ third-line)
+ 'block :expanded nil)))))))
+
+(ert-deftest evil-test-type-transform ()
+ "Test `evil-transform'"
+ :tags '(evil type)
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (ert-info ("Return positions unchanged when passed nil \
+for TYPE or TRANSFORM")
+ (should (equal (evil-transform nil 1 2 'block)
+ '(1 2 block)))
+ (should (equal (evil-transform :expand 1 2 nil)
+ '(1 2)))
+ (should (equal (evil-transform nil 1 2 nil)
+ '(1 2))))
+ (ert-info ("Accept markers, but return positions")
+ (should (equal (evil-transform :expand
+ (move-marker (make-marker) 1) 1
+ 'inclusive)
+ '(1 2 inclusive :expanded t)))
+ (should (equal (evil-transform nil (move-marker (make-marker) 1) 2
+ nil)
+ '(1 2))))))
+
+(ert-deftest evil-test-type-modifiers ()
+ "Test type modifiers like \"dv}\""
+ :tags '(evil type)
+ (ert-info ("Change `inclusive' motions to `exclusive'")
+ (evil-test-buffer
+ "[A]bove some line"
+ ("dve")
+ "[e] some line"))
+ (ert-info ("Change `exclusive' motions to `inclusive'")
+ (evil-test-buffer
+ "Above [s]ome line
+
+Below some empty line"
+ ("dv}")
+ "Above[ ]
+Below some empty line"))
+ (ert-info ("Change type to `line'")
+ (evil-test-buffer
+ "Above [s]ome line
+
+Below some empty line"
+ ("dV}")
+ "Below [s]ome empty line")))
+
+;;; Insertion
+
+(ert-deftest evil-test-insert ()
+ "Test `evil-insert'"
+ :tags '(evil insert)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save"
+ ("ievil rulz " [escape])
+ ";; evil rulz[ ]This buffer is for notes you don't want to save"))
+
+(ert-deftest evil-test-append ()
+ "Test `evil-append'"
+ :tags '(evil insert)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save"
+ ("aevil rulz " [escape])
+ ";; Tevil rulz[ ]his buffer is for notes you don't want to save"))
+
+(ert-deftest evil-test-visual-append ()
+ "Test `evil-append' from visual state"
+ :tags '(evil insert)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save"
+ ("veA_evil rulz " [escape])
+ ";; This_evil rulz[ ] buffer is for notes you don't want to save"))
+
+(ert-deftest evil-test-open-above ()
+ "Test `evil-open-above'"
+ :tags '(evil insert)
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save,
+\[;]; and for Lisp evaluation."
+ ("Oabc\ndef" [escape])
+ ";; This buffer is for notes you don't want to save,
+abc
+de[f]
+;; and for Lisp evaluation.")
+ (ert-info ("Open empty line")
+ (evil-test-buffer
+ "(let (var)\n [t]est)\n"
+ (emacs-lisp-mode)
+ ("O" [escape])
+ "(let (var)\n[\n] test)\n"))
+ (ert-info ("Open non-empty line")
+ (evil-test-buffer
+ "(let (var)\n [t]est)\n"
+ (emacs-lisp-mode)
+ ("Odo-it" [escape])
+ "(let (var)\n do-i[t]\n test)\n")))
+
+(ert-deftest evil-test-open-below ()
+ "Test `evil-open-below'"
+ :tags '(evil insert)
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("oabc\ndef" [escape])
+ ";; This buffer is for notes you don't want to save,
+abc
+de[f]
+;; and for Lisp evaluation.")
+ (ert-info ("Open empty line")
+ (evil-test-buffer
+ "[(]let (var)\n test)\n"
+ (emacs-lisp-mode)
+ ("o" [escape])
+ "(let (var)\n[\n] test)\n"))
+ (ert-info ("Open non-empty line")
+ (evil-test-buffer
+ "[(]let (var)\n test)\n"
+ (emacs-lisp-mode)
+ ("odo-it" [escape])
+ "(let (var)\n do-i[t]\n test)\n"))
+ (let ((evil-auto-indent t))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "[(]and a\n c)\n"
+ (emacs-lisp-mode)
+ ("3ob" [escape])
+ "(and a\n b\n b\n [b]\n c)\n"))))
+
+(ert-deftest evil-test-open-below-folded ()
+ "Test `evil-open-below' on folded lines"
+ :tags '(evil insert)
+ (evil-test-buffer
+ "[l]ine1\n\n(let ()\n var)\n\nlast line\n"
+ (emacs-lisp-mode)
+ (hs-minor-mode 1)
+ ("zm2joABC" [escape])
+ "line1\n\n(let ()\n var)\nAB[C]\n\nlast line\n"))
+
+(ert-deftest evil-test-insert-line ()
+ "Test `evil-insert-line'"
+ :tags '(evil insert)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save"
+ ("Ievil rulz " [escape])
+ "evil rulz[ ];; This buffer is for notes you don't want to save"))
+
+(ert-deftest evil-test-append-line ()
+ "Test `evil-append-line'"
+ :tags '(evil insert)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save"
+ ("Aevil rulz " [escape])
+ ";; This buffer is for notes you don't want to saveevil rulz[ ]"))
+
+(ert-deftest evil-test-insert-digraph ()
+ "Test `evil-insert-digraph'"
+ :tags '(evil insert)
+ (ert-info ("Predefined digraph")
+ (evil-test-buffer
+ ("i\C-kae")
+ "æ[]"))
+ (ert-info ("Custom digraph")
+ (let ((evil-digraphs-table-user '(((?a ?o) . ?å))))
+ (evil-test-buffer
+ ("i\C-kao")
+ "å[]")))
+ (ert-info ("Digraph in replace state")
+ (evil-test-buffer
+ "ab[c]defgh"
+ ("R\C-kc,")
+ "abç[d]efgh")
+ (ert-info ("with count")
+ (evil-test-buffer
+ "abc[d]efgh"
+ ("R\C-u3\C-kd*")
+ "abcδδδ[g]h"))))
+
+;;; Repeat system
+
+(ert-deftest evil-test-normalize-repeat-info ()
+ "Test `evil-normalize-repeat-info'"
+ :tags '(evil repeat)
+ (ert-info ("Single array")
+ (should (equal (evil-normalize-repeat-info
+ '("abc"))
+ '([?a ?b ?c])))
+ (should (equal (evil-normalize-repeat-info
+ '("\M-f"))
+ (list (kbd "M-f")))))
+ (ert-info ("Single symbol")
+ (should (equal (evil-normalize-repeat-info
+ '(SYM))
+ '(SYM))))
+ (ert-info ("Arrays only")
+ (should (equal (evil-normalize-repeat-info
+ '("abc" [XX YY] "def"))
+ '([?a ?b ?c XX YY ?d ?e ?f]))))
+ (ert-info ("Several symbols")
+ (should (equal (evil-normalize-repeat-info
+ '(BEG MID END))
+ '(BEG MID END))))
+ (ert-info ("Arrays with symbol at the beginning")
+ (should (equal (evil-normalize-repeat-info
+ '(BEG "abc" [XX YY] "def"))
+ '(BEG [?a ?b ?c XX YY ?d ?e ?f]))))
+ (ert-info ("Arrays with symbol at the end")
+ (should (equal (evil-normalize-repeat-info
+ '("abc" [XX YY] "def" END))
+ '([?a ?b ?c XX YY ?d ?e ?f] END))))
+ (ert-info ("Arrays with symbol in the middle")
+ (should (equal (evil-normalize-repeat-info
+ '("abc" [XX YY] MID "def" ))
+ '([?a ?b ?c XX YY] MID [?d ?e ?f]))))
+ (ert-info ("Concatenate arrays with several symbols")
+ (should (equal (evil-normalize-repeat-info
+ '(BEG "abc" [XX YY] MID "def" END))
+ '(BEG [?a ?b ?c XX YY] MID [?d ?e ?f] END)))))
+
+(defun evil-test-repeat-info (keys &optional recorded)
+ "Execute a sequence of keys and verify that `evil-repeat-ring'
+records them correctly. KEYS is the sequence of keys to execute.
+RECORDED is the expected sequence of recorded events.
+If nil, KEYS is used."
+ (execute-kbd-macro keys)
+ (should (equal (evil-normalize-repeat-info (ring-ref evil-repeat-ring 0))
+ (list (vconcat (or recorded keys))))))
+
+(ert-deftest evil-test-normal-repeat-info-simple-command ()
+ "Save key-sequence after simple editing command in Normal state"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[T]his is a test buffer"
+ (ert-info ("Call simple command without count")
+ (evil-test-repeat-info "x"))
+ (ert-info ("Call simple command with count 3")
+ (evil-test-repeat-info "3x"))))
+
+(ert-deftest evil-test-normal-repeat-info-char-command ()
+ "Save key-sequence after editing command with character in Normal state"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[T]his is a test buffer"
+ (ert-info ("Call command with character argument without count")
+ (evil-test-repeat-info "r5"))
+ (ert-info ("Call command with character argument with count 12")
+ (evil-test-repeat-info "12rX"))))
+
+(ert-deftest evil-test-insert-repeat-info ()
+ "Save key-sequence after Insert state"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ (ert-info ("Insert text without count")
+ (evil-test-repeat-info (vconcat "iABC" [escape])))
+ (ert-info ("Insert text with count 42")
+ (evil-test-repeat-info (vconcat "42iABC" [escape])))))
+
+(ert-deftest evil-test-repeat ()
+ "Repeat several editing commands"
+ :tags '(evil repeat)
+ (ert-info ("Repeat replace")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("rX")
+ "[X]; This buffer is for notes you don't want to save"
+ ([right right] ".")
+ "X;[X]This buffer is for notes you don't want to save"))
+ (ert-info ("Repeat replace with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("2rX")
+ "X[X] This buffer is for notes you don't want to save"
+ ([right right] ".")
+ "XX X[X]is buffer is for notes you don't want to save"))
+ (ert-info ("Repeat replace without count with a new count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("rX")
+ "[X]; This buffer is for notes you don't want to save"
+ ([right right] "13.")
+ "X;XXXXXXXXXXXX[X]is for notes you don't want to save"))
+ (ert-info ("Repeat replace with count replacing original count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("10rX")
+ "XXXXXXXXX[X]ffer is for notes you don't want to save"
+ ([right right] "20.")
+ "XXXXXXXXXXfXXXXXXXXXXXXXXXXXXX[X] don't want to save"))
+ (ert-info ("Repeat movement in Insert state")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save"
+ ("i(\M-f)" [escape])
+ ";; (This[)] buffer is for notes you don't want to save"
+ ("w.")
+ ";; (This) (buffer[)] is for notes you don't want to save")))
+
+(ert-deftest evil-test-repeat-register ()
+ "Test repeating a register command."
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4\n"
+ ("\"addyy\"aP")
+ "[l]ine 1\nline 2\nline 3\nline 4\n"
+ (".")
+ "[l]ine 1\nline 1\nline 2\nline 3\nline 4\n"))
+
+(ert-deftest evil-test-repeat-numeric-register ()
+ "Test repeating a command with a numeric register."
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4\nline 5\n"
+ ("dd...")
+ "[l]ine 5\n"
+ ("\"1P")
+ "[l]ine 4\nline 5\n"
+ (".")
+ "[l]ine 3\nline 4\nline 5\n"
+ (".")
+ "[l]ine 2\nline 3\nline 4\nline 5\n"
+ (".")
+ "[l]ine 1\nline 2\nline 3\nline 4\nline 5\n"))
+
+(ert-deftest evil-test-cmd-replace-char ()
+ "Calling `evil-replace-char' should replace characters"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("r5")
+ "[5]; This buffer is for notes you don't want to save"
+ ("3rX")
+ "XX[X]This buffer is for notes you don't want to save")
+ (ert-info ("Replace digraph")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save"
+ ("r e'")
+ "[é]; This buffer is for notes you don't want to save"
+ ("3r c*")
+ "ξξ[ξ]This buffer is for notes you don't want to save"))
+ (ert-info ("Replacing \\n should insert only one newline")
+ (evil-test-buffer
+ "(setq var xxx [y]yy zzz)\n"
+ (emacs-lisp-mode)
+ (setq indent-tabs-mode nil)
+ ("2r\n")
+ "(setq var xxx \n [y] zzz)\n")))
+
+(ert-deftest evil-test-insert-with-count ()
+ "Test `evil-insert' with repeat count"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes"
+ ("2ievil rulz " [escape])
+ ";; evil rulz evil rulz[ ]This buffer is for notes"))
+
+(ert-deftest evil-test-repeat-insert ()
+ "Test repeating of `evil-insert'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("iABC" [escape])
+ "AB[C];; This buffer is for notes"
+ ("..")
+ "ABABAB[C]CC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("2iABC" [escape])
+ "ABCAB[C];; This buffer is for notes"
+ ("..")
+ "ABCABABCABABCAB[C]CC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("iABC" [escape])
+ "AB[C];; This buffer is for notes"
+ ("11.")
+ "ABABCABCABCABCABCABCABCABCABCABCAB[C]C;; This buffer is for notes"))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("10iABC" [escape])
+ "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
+ ("11.")
+ "ABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCABCABCABCABCAB[C]C;; \
+This buffer is for notes")))
+
+(ert-deftest evil-test-repeat-error ()
+ "Test whether repeat returns to normal state in case of an error."
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ ("ixxx" [down] [down] [left] [left] [left] "yyy" [escape])
+ "xxxline 1\nline 2\nyy[y]line 3\nline 4"
+ (should-error (execute-kbd-macro "j^."))
+ (should (evil-normal-state-p))
+ ("^")
+ "xxxline 1\nline 2\nyyyline 3\n[x]xxline 4"))
+
+(ert-deftest evil-test-quoted-insert ()
+ "Test evil-quoted-insert in replace state."
+ (ert-info ("Simple replace C-v")
+ (evil-test-buffer
+ "ab[c]defg"
+ ("R\C-vx")
+ "abx[d]efg"))
+ (ert-info ("Control char replace C-v")
+ (evil-test-buffer
+ "ab[c]defg"
+ ("R\C-v\C-g")
+ "ab[d]efg"))
+ (ert-info ("C-v with count")
+ (evil-test-buffer
+ "ab[c]defg"
+ ("R\C-u3\C-vx")
+ "abxxx[f]g"))
+ (ert-info ("C-v with count near eol")
+ (evil-test-buffer
+ "abcde[f]g"
+ ("R\C-u3\C-vx")
+ "abcdexxx[]"))
+ (ert-info ("C-v in replace can be backspaced")
+ (evil-test-buffer
+ "ab[c]defg"
+ ("R\C-u3\C-vx" [backspace])
+ "abxx[e]fg")))
+
+(ert-deftest evil-test-repeat-quoted-insert ()
+ "Test whether `quoted-insert' can be repeated."
+ (ert-info ("Insert C-v")
+ (evil-test-buffer
+ "lin[e] 1\nline 2\nline 3\n"
+ ("i\C-v\C-v" [escape])
+ "lin[]e 1\nline 2\nline 3\n"))
+ (ert-info ("Insert ESC")
+ (evil-test-buffer
+ "lin[e] 1\nline 2\nline 3\n"
+ ("i\C-v" [escape escape])
+ "lin[]e 1\nline 2\nline 3\n"))
+ (ert-info ("Block insert C-v")
+ (evil-test-buffer
+ "lin[e] 1\nline 2\nline 3\n"
+ ("gg\C-vGI\C-v\C-v" [escape])
+ "[]line 1\nline 2\nline 3\n")))
+
+(ert-deftest evil-test-insert-vcount ()
+ "Test `evil-insert' with vertical repeating"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+
+;; Below the empty line."
+ (define-key evil-normal-state-local-map "i"
+ #'(lambda (count)
+ (interactive "p")
+ (evil-insert count 5)))
+ ("2iABC" [escape])
+ "\
+;; ABCAB[C]This buffer is for notes you don't want to save.
+;; ABCABCIf you want to create a file, visit that file with C-x C-f,
+;; ABCABCthen enter the text in that file's own buffer.
+ ABCABC
+;; ABCABCBelow the empty line."))
+
+(ert-deftest evil-test-append-with-count ()
+ "Test `evil-append' with repeat count"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes"
+ ("2aevil rulz " [escape])
+ ";; Tevil rulz evil rulz[ ]his buffer is for notes"))
+
+(ert-deftest evil-test-repeat-append ()
+ "Test repeating of `evil-append'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("aABC" [escape])
+ ";AB[C]; This buffer is for notes"
+ ("..")
+ ";ABCABCAB[C]; This buffer is for notes"))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("2aABC" [escape])
+ ";ABCAB[C]; This buffer is for notes"
+ ("..")
+ ";ABCABCABCABCABCAB[C]; This buffer is for notes"))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("aABC" [escape])
+ ";AB[C]; This buffer is for notes"
+ ("11.")
+ ";ABCABCABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes"
+ ("10aABC" [escape])
+ ";ABCABCABCABCABCABCABCABCABCAB[C]; This buffer is for notes"
+ ("11.")
+ ";ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]; \
+This buffer is for notes")))
+
+(ert-deftest evil-test-append-vcount ()
+ "Test `evil-append' with vertical repeating"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+
+;; Below the empty line."
+ (define-key evil-normal-state-local-map "a"
+ #'(lambda (count)
+ (interactive "p")
+ (evil-append count 5)))
+ ("2aABC" [escape])
+ "\
+;; TABCAB[C]his buffer is for notes you don't want to save.
+;; IABCABCf you want to create a file, visit that file with C-x C-f,
+;; tABCABChen enter the text in that file's own buffer.
+ ABCABC
+;; BABCABCelow the empty line."))
+
+(ert-deftest evil-test-open-above-with-count ()
+ "Test `evil-open-above' with repeat count"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save,
+\[;]; and for Lisp evaluation."
+ ("2Oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."))
+
+(ert-deftest evil-test-repeat-open-above ()
+ "Test repeating of `evil-open-above'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save."
+ ("Oevil\nrulz" [escape])
+ "evil\nrul[z]
+;; This buffer is for notes you don't want to save."
+ ("..")
+ "evil\nevil\nevil\nrul[z]\nrulz\nrulz
+;; This buffer is for notes you don't want to save."))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save."
+ ("2Oevil\nrulz" [escape])
+ "evil\nrulz\nevil\nrul[z]
+;; This buffer is for notes you don't want to save."
+ ("..")
+ "evil\nrulz\nevil\nevil\nrulz\nevil\nevil\nrulz\nevil\nrul[z]\nrulz\nrulz
+;; This buffer is for notes you don't want to save."))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save."
+ ("Oevil\nrulz" [escape])
+ "evil\nrul[z]\n;; This buffer is for notes you don't want to save."
+ ("2.")
+ "evil\nevil\nrulz\nevil\nrul[z]\nrulz
+;; This buffer is for notes you don't want to save."))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save."
+ ("2Oevil\nrulz" [escape])
+ "evil\nrulz\nevil\nrul[z]
+;; This buffer is for notes you don't want to save."
+ ("3.")
+ "evil\nrulz\nevil\nevil\nrulz\nevil\nrulz\nevil\nrul[z]\nrulz
+;; This buffer is for notes you don't want to save.")))
+
+(ert-deftest evil-test-open-below-with-count ()
+ "Test insertion of `evil-open-below' with repeat count"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."))
+
+(ert-deftest evil-test-repeat-open-below ()
+ "Test repeating `evil-open-below'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrul[z]\n;; and for Lisp evaluation."
+ ("..")
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."
+ ("..")
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrul[z]\n;; and for Lisp evaluation."
+ ("2.")
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2oevil\nrulz" [escape])
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation."
+ ("3.")
+ ";; This buffer is for notes you don't want to save,
+evil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrulz\nevil\nrul[z]
+;; and for Lisp evaluation.")))
+
+(ert-deftest evil-test-insert-line-with-count ()
+ "Test `evil-insert-line' with repeat count"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes"
+ ("2Ievil rulz " [escape])
+ "evil rulz evil rulz[ ];; This buffer is for notes"))
+
+(ert-deftest evil-test-repeat-insert-line ()
+ "Test repeating of `evil-insert-line'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ ";; This buffer is for note[s]"
+ ("IABC" [escape])
+ "AB[C];; This buffer is for notes"
+ ("..")
+ "AB[C]ABCABC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ ";; This buffer is for note[s]"
+ ("2IABC" [escape])
+ "ABCAB[C];; This buffer is for notes"
+ ("..")
+ "ABCAB[C]ABCABCABCABC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ ";; This buffer is for note[s]"
+ ("IABC" [escape])
+ "AB[C];; This buffer is for notes"
+ ("11.")
+ "ABCABCABCABCABCABCABCABCABCABCAB[C]ABC;; This buffer is for notes"))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ ";; This buffer is for note[s]"
+ ("10IABC" [escape])
+ "ABCABCABCABCABCABCABCABCABCAB[C];; This buffer is for notes"
+ ("11.")
+ "ABCABCABCABCABCABCABCABCABCABCAB[C]ABCABCABCABCABCABCABCABCABCABC;; This buffer is for notes")))
+
+(ert-deftest evil-test-insert-line-vcount ()
+ "Test `evil-insert-line' with vertical repeating"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "int[ ]main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ (define-key evil-normal-state-local-map "I"
+ #'(lambda (count)
+ (interactive "p")
+ (evil-insert-line count 4)))
+ ("2IABC" [escape])
+ "ABCABCint main(int argc, char** argv)
+ABCABC{
+ ABCABCprintf(\"Hello world\\n\");
+ ABCABCreturn EXIT_SUCCESS;
+}"))
+
+(ert-deftest evil-test-append-line-with-count ()
+ "Test `evil-append-line' with repeat count"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("2Aevil rulz " [escape])
+ ";; This buffer is for notes.evil rulz evil rulz[ ]"))
+
+(ert-deftest evil-test-repeat-append-line ()
+ "Test repeating of `evil-append-line'"
+ :tags '(evil repeat)
+ (ert-info ("Repeat insert")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("AABC" [escape])
+ ";; This buffer is for notes.AB[C]"
+ ("..")
+ ";; This buffer is for notes.ABCABCAB[C]"))
+ (ert-info ("Repeat insert with count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("2AABC" [escape])
+ ";; This buffer is for notes.ABCAB[C]"
+ ("..")
+ ";; This buffer is for notes.ABCABCABCABCABCAB[C]"))
+ (ert-info ("Repeat insert with repeat count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("AABC" [escape])
+ ";; This buffer is for notes.ABC"
+ ("11.")
+ ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCAB[C]"))
+ (ert-info ("Repeat insert with count with repeat with count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("10AABC" [escape])
+ ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCAB[C]"
+ ("11.")
+ ";; This buffer is for notes.ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB[C]")))
+
+(ert-deftest evil-test-append-line-vcount ()
+ "Test `evil-append-line' with vertical repeating"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "int[ ]main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ (define-key evil-normal-state-local-map "A"
+ #'(lambda (count)
+ (interactive "p")
+ (evil-append-line count 4)))
+ ("2AABC" [escape])
+ "int main(int argc, char** argv)ABCAB[C]
+{ABCABC
+ printf(\"Hello world\\n\");ABCABC
+ return EXIT_SUCCESS;ABCABC
+}"))
+
+(ert-deftest evil-test-repeat-by-change ()
+ "Test repeating by tracking changes for completion commands"
+ :tags '(evil repeat)
+ (let ((line-move-visual nil)
+ (change (evil-define-command nil ()
+ :repeat change
+ (interactive)
+ (delete-char 5)
+ (insert "BEGIN\n")
+ (save-excursion
+ (insert "\nEND\n")))))
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ (define-key evil-insert-state-local-map (kbd "C-c C-p") change)
+ ("iABC " (kbd "C-c C-p") "BODY" [escape])
+ ";; ABC BEGIN
+BOD[Y]
+END
+buffer is for notes."
+ (".")
+ ";; ABC BEGIN
+BODABC BEGIN
+BOD[Y]
+END
+
+buffer is for notes.")))
+
+(ert-deftest evil-test-repeat-kill-buffer ()
+ "Test safe-guard preventing buffers from being deleted
+when repeating a command"
+ :tags '(evil repeat)
+ (ert-info ("Test killing works for direct calls \
+to `evil-execute-repeat-info'")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ (setq evil-repeat-ring (make-ring 10))
+ (ring-insert evil-repeat-ring '((kill-buffer nil)))
+ (evil-execute-repeat-info (ring-ref evil-repeat-ring 0))
+ (should-not (looking-at ";; This"))))
+ (ert-info ("Verify an error is raised when using \
+the `evil-repeat' command")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ (setq evil-repeat-ring (make-ring 10))
+ (ring-insert evil-repeat-ring '((kill-buffer nil)))
+ (evil-execute-repeat-info (ring-ref evil-repeat-ring 0))
+ (should-error (call-interactively #'evil-repeat)))))
+
+(ert-deftest evil-test-repeat-pop ()
+ "Test `repeat-pop'."
+ :tags '(evil repeat)
+ (ert-info ("Test repeat-pop")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ (setq evil-repeat-ring (make-ring 10))
+ ("iABC" [escape] "aXYZ" [escape])
+ ";; ABCXY[Z]This buffer is for notes."
+ (".")
+ ";; ABCXYZXY[Z]This buffer is for notes."))
+ (ert-info ("Test repeat-pop")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ (setq evil-repeat-ring (make-ring 10))
+ ("iABC" [escape] "aXYZ" [escape])
+ ";; ABCXY[Z]This buffer is for notes."
+ ("." (kbd "C-."))
+ ";; ABCXYAB[C]ZThis buffer is for notes."))
+ (ert-info ("Test repeat-pop-next")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ (setq evil-repeat-ring (make-ring 10))
+ ("iABC" [escape] "aXYZ" [escape])
+ ";; ABCXY[Z]This buffer is for notes."
+ ("." (kbd "C-.") (kbd "M-."))
+ ";; ABCXYZXY[Z]This buffer is for notes."))
+ (ert-info ("Test repeat-pop after non-change")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ (setq evil-repeat-ring (make-ring 10))
+ ("iABC" [escape] "a" [escape] "aXYZ" [escape])
+ ";; ABCXY[Z]This buffer is for notes."
+ ("." (kbd "C-.") (kbd "C-."))
+ ";; ABCXYAB[C]ZThis buffer is for notes.")))
+
+(ert-deftest evil-test-ESC-repeat-normal-state ()
+ "Test if ESC is not been recorded in normal state."
+ :tags '(evil repeat)
+ (ert-info ("Test normal ESC")
+ (evil-test-buffer
+ ";;[ ]This buffer is for notes."
+ (setq evil-repeat-ring (make-ring 10))
+ (should (= (ring-length evil-repeat-ring) 0))
+ ("aABC" [escape])
+ ";; AB[C]This buffer is for notes."
+ (should (= (ring-length evil-repeat-ring) 1))
+ (".")
+ ";; ABCAB[C]This buffer is for notes."
+ ([escape])
+ (should (= (ring-length evil-repeat-ring) 1))
+ (".")
+ ";; ABCABCAB[C]This buffer is for notes.")))
+
+(ert-deftest evil-test-abort-operator-repeat ()
+ "Test if ESC in operator-state cancels recording of repeation."
+ :tags '(evil repeat)
+ (let ((inhibit-quit t))
+ (ert-info ("Test ESC")
+ (evil-test-buffer
+ ";;[ ]This buffer is for notes."
+ (setq evil-repeat-ring (make-ring 10))
+ (should (= (ring-length evil-repeat-ring) 0))
+ ("aABC" [escape])
+ ";; AB[C]This buffer is for notes."
+ (should (= (ring-length evil-repeat-ring) 1))
+ (".")
+ ";; ABCAB[C]This buffer is for notes."
+ ("d" [escape])
+ (should (= (ring-length evil-repeat-ring) 1))
+ (".")
+ ";; ABCABCAB[C]This buffer is for notes."))))
+
+(ert-deftest evil-test-repeat-with-find-char ()
+ "Ensure that repeating find-char commands doesn't change `evil-last-find'"
+ :tags '(evil repeat)
+ (evil-test-buffer
+ "[b]ar baz bat"
+ ("dfa" "fb")
+ "r [b]az bat"
+ (".")
+ "r [z] bat"
+ (";")
+ "r z [b]at"))
+
+(ert-deftest evil-test-repeat-visual-char ()
+ "Test repeat of character visual mode command."
+ :tags '(evil repeat)
+ (ert-info ("Test repeat on same line")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("v3lcABC" [escape])
+ ";; AB[C] buffer is for notes."
+ ("ww.")
+ ";; ABC buffer AB[C]or notes."))
+ (ert-info ("Test repeat on several lines")
+ (evil-test-buffer
+ ";; This [b]uffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+"
+ ("vj^eerX")
+ ";; This XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXX[X] you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+"
+ ("2gg^3w.")
+ ";; This XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXXX you want XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+XXXX[X]en enter the text in that file's own buffer.
+")))
+
+(ert-deftest evil-test-repeat-visual-line ()
+ "Test repeat of linewise visual mode command."
+ :tags '(evil repeat)
+ (ert-info ("Test repeat on several lines")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter th[e] text in that file's own buffer.
+
+;; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+"
+ ("VkcNew Text" [escape])
+ ";; This buffer is for notes you don't want to save.
+New Tex[t]
+
+;; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+"
+ ("jj.")
+ ";; This buffer is for notes you don't want to save.
+New Text
+
+New Tex[t]
+;; then enter the text in that file's own buffer.
+")))
+
+(ert-deftest evil-test-repeat-visual-block ()
+ "Test repeat of block visual mode command."
+ :tags '(evil repeat)
+ (ert-info ("Test repeat on several lines")
+ (evil-test-buffer
+ ";; This [b]uffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+;; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+"
+ ((kbd "C-v") "3j2lrQ")
+ ";; This [Q]QQfer is for notes you don't want to save.
+;; If yoQQQant to create a file, visit that file with C-x C-f,
+;; then QQQer the text in that file's own buffer.
+;; This QQQfer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer.
+"
+ ("2j3w.")
+ ";; This QQQfer is for notes you don't want to save.
+;; If yoQQQant to create a file, visit that file with C-x C-f,
+;; then QQQer the text [Q]QQthat file's own buffer.
+;; This QQQfer is for nQQQs you don't want to save.
+;; If you want to creatQQQ file, visit that file with C-x C-f,
+;; then enter the text QQQthat file's own buffer.
+")))
+
+(ert-deftest evil-visual-block-append ()
+ "Test appending in visual block."
+ :tags '(evil visual insert)
+ (ert-info ("Simple append")
+ (evil-test-buffer
+ "l[i]ne 1\nline 2\nline 3\n"
+ ((kbd "C-v") "jjllAXXX" [escape])
+ "lineXX[X] 1\nlineXXX 2\nlineXXX 3\n"))
+ (ert-info ("Append after empty lines")
+ (evil-test-buffer
+ "line 1l[i]ne 1\nline 2\nline 3line 3\n"
+ (setq indent-tabs-mode nil)
+ ((kbd "C-v") "jjllAXXX" [escape])
+ "line 1lineXX[X] 1\nline 2 XXX\nline 3lineXXX 3\n"))
+ (ert-info ("Append after empty first line")
+ (evil-test-buffer
+ "l[i]ne 1line 1\nline 2\nline 3line 3line 3\n"
+ (setq indent-tabs-mode nil)
+ ((kbd "C-v") "jj3feAXXX" [escape])
+ "line 1line 1 XX[X]\nline 2 XXX\nline 3line 3lineXXX 3\n"))
+ (ert-info ("Append after end of lines")
+ (evil-test-buffer
+ "line 1l[i]ne 1line 1\nline 2\nline 3line 3\n"
+ (setq indent-tabs-mode nil)
+ ((kbd "C-v") "jj$AXXX" [escape])
+ "line 1line 1line 1XX[X]\nline 2XXX\nline 3line 3XXX\n")))
+
+(ert-deftest evil-test-repeat-digraph ()
+ "Test repeat of insertion of a digraph."
+ :tags '(evil digraph repeat)
+ (evil-test-buffer
+ "Line with ['] several apostrophes ', yeah."
+ ("s" (kbd "C-k") "'9" [escape])
+ "Line with [’] several apostrophes ', yeah."
+ ("f'.")
+ "Line with ’ several apostrophes [’], yeah."))
+
+;;; Operators
+
+(ert-deftest evil-test-keypress-parser ()
+ "Test `evil-keypress-parser'"
+ :tags '(evil operator)
+ (evil-test-buffer
+ :state operator
+ (ert-info ("Read from the keyboard unless INPUT is given")
+ (evil-test-buffer
+ :state operator
+ (let ((unread-command-events '(?d)))
+ (should (equal (evil-keypress-parser)
+ '(evil-delete nil)))
+ (should (equal (evil-keypress-parser '(?d))
+ '(evil-delete nil))))))
+ (ert-info ("Read remainder from the keyboard if INPUT is incomplete")
+ (let ((unread-command-events '(?d)))
+ (should (equal (evil-keypress-parser '(?2))
+ '(evil-delete 2)))))
+ (ert-info ("Handle counts not starting with zero")
+ (should (equal (evil-keypress-parser '(?2 ?d))
+ '(evil-delete 2)))
+ (should (equal (evil-keypress-parser '(?2 ?0 ?d))
+ '(evil-delete 20)))
+ (should (equal (evil-keypress-parser '(?2 ?0 ?2 ?d))
+ '(evil-delete 202)))
+ (should (equal (evil-keypress-parser '(?4 ?0 ?4 ?g ??))
+ '(evil-rot13 404))))
+ (ert-info ("Treat 0 as a motion")
+ (should (equal
+ (evil-keypress-parser '(?0))
+ '(evil-beginning-of-line nil))))
+ (ert-info ("Handle keyboard macros")
+ (evil-test-buffer
+ (define-key evil-motion-state-local-map (kbd "W") (kbd "w"))
+ (should (equal (evil-keypress-parser '(?W))
+ '(evil-forward-word-begin nil)))))))
+
+(ert-deftest evil-test-invert-char ()
+ "Test `evil-invert-char'"
+ :tags '(evil operator)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("~")
+ ";; t[h]is buffer is for notes.")
+ (evil-test-buffer
+ ";; <[T]his> buffer is for notes."
+ ("~")
+ ";; [t]HIS buffer is for notes.")
+ (evil-test-buffer
+ :visual block
+ ";; <[T]his buffer is for notes,
+;; and >for Lisp evaluation."
+ ("~")
+ ";; [t]HIS buffer is for notes,
+;; AND for Lisp evaluation."))
+
+(ert-deftest evil-test-rot13 ()
+ "Test `evil-rot13'"
+ :tags '(evil operator)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("g?" [M-right])
+ ";; [G]uvf buffer is for notes you don't want to save."))
+
+(ert-deftest evil-test-rot13-with-count ()
+ "Test `evil-rot13' with count argument"
+ :tags '(evil operator)
+ (ert-info ("Count before operator")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("2g?" [M-right])
+ ";; [G]uvf ohssre is for notes you don't want to save."))
+ (ert-info ("Count before motion")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("g?2" [M-right])
+ ";; [G]uvf ohssre is for notes you don't want to save."))
+ (ert-info ("Count before operator and motion")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("3g?2" [M-right])
+ ";; [G]uvf ohssre vf sbe abgrf lbh don't want to save."))
+ (ert-info ("Count exceeding buffer boundaries")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("g?200" [right])
+ ";; [G]uvf ohssre vf sbe abgrf lbh qba'g jnag gb fnir.")))
+
+(ert-deftest evil-test-rot13-repeat ()
+ "Test repeating of `evil-rot13'"
+ :tags '(evil operator)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("g?" [M-right] [M-right])
+ ";; Guvf[ ]buffer is for notes you don't want to save."
+ (".")
+ ";; Guvf[ ]ohssre is for notes you don't want to save."))
+
+(ert-deftest evil-test-rot13-repeat-with-count ()
+ "Test repeating of `evil-rot13' with new count"
+ :tags '(evil operator)
+ (ert-info ("Count before operator")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("2g?" [M-right])
+ ";; [G]uvf ohssre is for notes you don't want to save."
+ ("3.")
+ ";; [T]his buffer vf for notes you don't want to save."))
+ (ert-info ("Count before motion")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("g?2" [M-right])
+ ";; [G]uvf ohssre is for notes you don't want to save."
+ ("3.")
+ ";; [T]his buffer vf for notes you don't want to save."))
+ (ert-info ("Count before operator and motion")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("3g?2" [M-right])
+ ";; [G]uvf ohssre vf sbe abgrf lbh don't want to save."
+ ("4.")
+ ";; [T]his buffer is for abgrf lbh don't want to save.")))
+
+(ert-deftest evil-test-operator-delete ()
+ "Test deleting text"
+ :tags '(evil operator)
+ (ert-info ("Delete characters")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("dl")
+ ";; [h]is buffer is for notes."
+ ("d1l")
+ ";; [i]s buffer is for notes."
+ ("1dl")
+ ";; [s] buffer is for notes."
+ ("1d1l")
+ ";; [ ]buffer is for notes."
+ ("d2l")
+ ";; [u]ffer is for notes."
+ ("2dl")
+ ";; [f]er is for notes."
+ ("d4l")
+ ";; [i]s for notes."
+ ("4dl")
+ ";; [o]r notes."
+ ("2d2l")
+ ";; [o]tes."))
+ (ert-info ("Delete current line")
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("dd")
+ ";; [a]nd for Lisp evaluation.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("d1d")
+ ";; [a]nd for Lisp evaluation.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("1dd")
+ ";; [a]nd for Lisp evaluation.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("1d1d")
+ ";; [a]nd for Lisp evaluation."))
+ (ert-info ("With `evil-start-of-line' `t'")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("dd")
+ "[;]; and for Lisp evaluation.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("d1d")
+ "[;]; and for Lisp evaluation.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("1dd")
+ "[;]; and for Lisp evaluation.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("1d1d")
+ "[;]; and for Lisp evaluation."))))
+ (ert-info ("Delete two lines")
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("d2d")
+ ";; [t]hen enter the text in that file's own buffer.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("2dd")
+ ";; [t]hen enter the text in that file's own buffer.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("dj")
+ ";; [t]hen enter the text in that file's own buffer.")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; [I]f you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("dk")
+ ";; [t]hen enter the text in that file's own buffer."))
+ (ert-info ("With `evil-start-of-line' `t'")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("d2d")
+ "[;]; then enter the text in that file's own buffer.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("2dd")
+ "[;]; then enter the text in that file's own buffer.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("dj")
+ "[;]; then enter the text in that file's own buffer.")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; [I]f you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("dk")
+ "[;]; then enter the text in that file's own buffer.")))))
+
+(evil-define-motion evil-test-square-motion (count)
+ "Test motion for selecting a square."
+ :type block
+ (let ((column (current-column)))
+ (forward-line (1- count))
+ (move-to-column (+ column count -1))))
+
+(ert-deftest evil-test-yank ()
+ "Test `evil-yank'"
+ :tags '(evil operator yank)
+ (ert-info ("Yank characters")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("y2e")
+ (should (string= (current-kill 0) "This buffer"))))
+ (ert-info ("Yank lines")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("yj")
+ (should (string= (current-kill 0)
+ (buffer-substring (point-min)
+ (1+ (line-end-position 2)))))
+ (should (eq (car-safe (get-text-property 0 'yank-handler
+ (current-kill 0)))
+ 'evil-yank-line-handler)))
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+\[;]; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("y5j")
+ (should
+ (string= (current-kill 0)
+ (concat (buffer-substring (line-beginning-position 1)
+ (point-max))
+ "\n")))
+ (should (eq (car-safe (get-text-property 0 'yank-handler
+ (current-kill 0)))
+ 'evil-yank-line-handler))))
+ (ert-info ("Yank rectangle")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y3s")
+ (should (string= (current-kill 0) "Thi\nIf \nthe"))
+ (should (eq (car-safe (get-text-property 0 'yank-handler
+ (current-kill 0)))
+ 'evil-yank-block-handler))))
+ (ert-info (":yank, then paste")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":yank" [return] "p")
+ "a\nb\nb\nc\nd\n"))
+ (ert-info (":yank with COUNT")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":yank 2" [return] "p")
+ "a\nb\nb\nc\nc\nd\n"))
+ (ert-info (":yank with COUNT in visual state")
+ (evil-test-buffer
+ "a\n<b\nc>\nd\ne\nf\n"
+ (":yank 3" [return] "p")
+ "a\nb\nc\nd\ne\nc\nd\ne\nf\n"))
+ (ert-info (":yank with REGISTER")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":yank r") ;; yank into the 'r' register
+ "a\nb\nc\nd\n"
+ ;; check the 'r' register contains the yanked text
+ (should (string= (substring-no-properties (evil-get-register ?r)) "b\n"))))
+ (ert-info (":yank with REGISTER and COUNT")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\ne\nf\n"
+ (":yank r 3")
+ "a\nb\nc\nd\ne\nf\n"
+ (should (string= (substring-no-properties (evil-get-register ?r)) "b\nc\nd\n"))))
+ (ert-info (":yank with range yanks without moving point")
+ (evil-test-buffer
+ "[a]\nb\nc\nd\ne\n"
+ (":4y" [return] "p")
+ "a\n[d]\nb\nc\nd\ne\n")
+ (evil-test-buffer
+ "[a]\nb\nc\nd\ne\n"
+ (":+4y" [return] "p")
+ "a\n[e]\nb\nc\nd\ne\n")))
+
+(ert-deftest evil-test-delete ()
+ "Test `evil-delete'"
+ :tags '(evil operator delete)
+ (ert-info ("Delete characters")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save[.]"
+ ("x")
+ ";; This buffer is for notes you don't want to sav[e]"
+ (goto-char 4)
+ ";; [T]his buffer is for notes you don't want to save"
+ ("d2e")
+ ";; [ ]is for notes you don't want to save"
+ (should (string= (current-kill 0) "This buffer"))
+ ("P")
+ ";; This buffe[r] is for notes you don't want to save"))
+ (ert-info ("Delete lines")
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("2dd")
+ ";; [t]hen enter the text in that file's own buffer."
+ ("P")
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("With `evil-start-of-line' `t'")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("2dd")
+ "[;]; then enter the text in that file's own buffer."
+ ("P")
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))))
+ (ert-info ("Delete last line")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; [I]f you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("2dd")
+ ";; [T]his buffer is for notes you don't want to save."))
+ (ert-info ("Delete last empty line")
+ (evil-test-buffer
+ "line 1\nline 2\n\n[]"
+ ("dd")
+ "line 1\nline 2\n[]"))
+ (ert-info ("Delete rectangle")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("d3s")
+ "[T]his buffer is for notes you don't want to save.
+If you want to create a file, visit that file with C-x C-f,
+then enter the text in that file's own buffer."))
+ (ert-info (":delete")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":delete")
+ "a\nc\nd\n"))
+ (ert-info (":delete with COUNT")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":delete 2")
+ "a\nd\n"))
+ (ert-info (":delete with COUNT in visual state")
+ (evil-test-buffer
+ "a\n<b\nc>\nd\ne\nf\n"
+ (":delete 3")
+ "a\nb\nf\n"))
+ (ert-info (":delete with REGISTER")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\n"
+ (":delete r") ;; delete into the 'r' register
+ "a\nc\nd\n"
+ ;; check the 'r' register contains the deleted text
+ (should (string= (substring-no-properties (evil-get-register ?r)) "b\n"))))
+ (ert-info (":delete with REGISTER and COUNT")
+ (evil-test-buffer
+ "a\n[b]\nc\nd\ne\nf\n"
+ (":delete r 3")
+ "a\ne\nf\n"
+ (should (string= (substring-no-properties (evil-get-register ?r)) "b\nc\nd\n"))))
+ (ert-info ("Charwise multiple whole line delete becomes linewise")
+ (evil-test-buffer
+ "1\n[2]\n3\n4"
+ ("d2w")
+ "1\n[4]")))
+
+(ert-deftest evil-test-delete-line ()
+ "Test `evil-delete-line'"
+ :tags '(evil operator)
+ (ert-info ("Delete to end of line")
+ (evil-test-buffer
+ ";; This buffer is for notes[ ]you don't want to save."
+ ("D")
+ ";; This buffer is for note[s]"))
+ (ert-info ("Act linewise on character selection")
+ (evil-test-buffer
+ ";; This <buffe[r]> is for notes,
+and for Lisp evaluation."
+ ("D")
+ "[a]nd for Lisp evaluation."))
+ (ert-info ("Act on each line of block selection")
+ (evil-test-buffer
+ :visual block
+ ";; This buffer is for <notes,
+;; and for Lisp evaluatio[n]>."
+ ("D")
+ ";; This buffer is for[ ]
+;; and for Lisp evalua"))
+ (ert-info ("Yank full block with block selection")
+ (evil-test-buffer
+ :visual block
+ "line1 l<ine1 line1 line1\nline2 line2\nline3 lin>e3 line3\n"
+ ("D")
+ "line1 [l]\nline2 l\nline3 l\n"
+ ("0P")
+ "ine1 line1 line1line1 l
+ine2 line2 l
+ine3 line3 line3 l\n")))
+
+(ert-deftest evil-test-delete-folded ()
+ "Test `evil-delete' on folded lines."
+ :tags '(evil operator)
+ (ert-info ("Delete folded lines")
+ (evil-test-buffer
+ "[l]ine1\n\n(let ()\n var)\n\n(let ()\n var2)\n"
+ (emacs-lisp-mode)
+ (hs-minor-mode 1)
+ ("zm2jdd")
+ "line1\n\n[\n](let ()\n var2)\n"))
+ (ert-info ("Delete folded lines with count")
+ (evil-test-buffer
+ "[l]ine1\n\n(let ()\n var)\n\n(let ()\n var2)\n\nlast line\n"
+ (emacs-lisp-mode)
+ (hs-minor-mode 1)
+ ("zm2j3dd")
+ "line1\n\n[\n]last line\n")))
+
+(ert-deftest evil-test-delete-backward-word ()
+ "Test `evil-delete-backward-word' in insert & replace states."
+ :tags '(evil)
+ (ert-info ("evil-delete-backward-word in insert state")
+ (let ((evil-backspace-join-lines t))
+ (evil-test-buffer
+ "abc def\n ghi j[k]l\n"
+ ("i" (kbd "C-w"))
+ "abc def\n ghi [k]l\n"
+ ((kbd "C-w"))
+ "abc def\n [k]l\n"
+ ((kbd "C-w"))
+ "abc def\n[k]l\n"
+ ((kbd "C-w"))
+ "abc def[k]l\n"))
+ (let (evil-backspace-join-lines)
+ (evil-test-buffer
+ "abc def\n[k]l\n"
+ (should-error (execute-kbd-macro (concat "i" (kbd "C-w"))))
+ "abc def\n[k]l\n")))
+ (ert-info ("evil-delete-backward-word in replace state")
+ (evil-test-buffer
+ "alpha bravo [c]harlie delta"
+ ("R" "one two")
+ "alpha bravo one two[ ]delta"
+ ("\C-w")
+ "alpha bravo one [l]ie delta"
+ ("\C-w")
+ "alpha bravo [c]harlie delta"
+ ("\C-w")
+ "alpha [b]ravo charlie delta")))
+
+(ert-deftest evil-test-delete-back-to-indentation ()
+ "Test `evil-delete-back-to-indentation' in insert & replace states."
+ :tags '(evil)
+ (let ((evil-backspace-join-lines t))
+ (evil-test-buffer
+ "abc def\n ghi j[k]l\n"
+ ("i" (call-interactively #'evil-delete-back-to-indentation))
+ "abc def\n [k]l\n"
+ (left-char 2)
+ "abc def\n [ ] kl\n"
+ (call-interactively #'evil-delete-back-to-indentation)
+ "abc def\n[ ] kl\n"
+ (call-interactively #'evil-delete-back-to-indentation)
+ "abc def[ ] kl\n"))
+ (let (evil-backspace-join-lines)
+ (evil-test-buffer
+ "abc def\n[k]l\n"
+ (should-error
+ (progn
+ (execute-kbd-macro "i")
+ (call-interactively #'evil-delete-back-to-indentation)))
+ "abc def\n[k]l\n"))
+ (ert-info ("Delete back to indentation in replace state")
+ (evil-test-buffer
+ " alpha [b]ravo charlie"
+ ("R" "delta")
+ " alpha delta[ ]charlie"
+ (evil-delete-back-to-indentation)
+ " [a]lpha bravo charlie")))
+
+(ert-deftest evil-test-change ()
+ "Test `evil-change'"
+ :tags '(evil operator)
+ (ert-info ("Change characters")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("c2eABC" [escape])
+ ";; AB[C] is for notes you don't want to save."
+ (should (string= (current-kill 0) "This buffer"))
+ ("p")
+ ";; ABCThis buffe[r] is for notes you don't want to save."))
+ (ert-info ("Change lines")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("2ccABCLINE\nDEFLINE" [escape])
+ "ABCLINE
+DEFLIN[E]
+;; then enter the text in that file's own buffer."
+ ("p")
+ "ABCLINE
+DEFLINE
+\[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Change last line")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; [I]f you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("2ccABC" [escape])
+ ";; This buffer is for notes you don't want to save.
+AB[C]"))
+ (ert-info ("C changes whole line in visual characterwise and linewise states")
+ (evil-test-buffer
+ "Two lines [s]hould suffice
+for this test."
+ ("veC" "all gone!")
+ "all gone![]
+for this test.")
+ (evil-test-buffer
+ "Two lines [w]ill be fine
+for this test too."
+ ("VjC" "all gone!")
+ "all gone![]"))
+ (ert-info ("C clears the visual blockwise selection, and all text to the right")
+ (evil-test-buffer
+ "Two [l]ines will be fine for
+the tests here as well."
+ ("\C-vjeC")
+ "Two []
+the "))
+ (ert-info ("S clears the whole line in normal mode, and all lines touched by visual selection")
+ (evil-test-buffer
+ "Two lines [s]hould suffice
+for this test."
+ ("S" "all gone!")
+ "all gone![]
+for this test.")
+ (evil-test-buffer
+ "Two lines [s]hould suffice
+for this test."
+ ("vS" "all gone!")
+ "all gone![]
+for this test.")
+ (evil-test-buffer
+ "Two lines [s]hould suffice
+for this test."
+ ("VjS" "all gone!")
+ "all gone![]")
+ (evil-test-buffer
+ "Two lines [s]hould suffice
+for this test."
+ ("\C-VjS" "all gone!")
+ "all gone![]"))
+ (ert-info ("R behaves the same as S in visual modes")
+ (evil-test-buffer
+ "Two lines [s]hould suffice
+for this test."
+ ("vR" "all gone!")
+ "all gone![]
+for this test."))
+ (ert-info ("Change rectangle")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("c3sABC" [escape])
+ "AB[C]This buffer is for notes you don't want to save.
+ABCIf you want to create a file, visit that file with C-x C-f,
+ABCthen enter the text in that file's own buffer.")))
+
+(ert-deftest evil-maybe-remove-spaces-test ()
+ "Test maybe removing (indentation) spaces after some commands when making a clear line."
+ :tags '(evil operator)
+ (ert-info ("changing the line and returning to normal mode removes spaces")
+ (evil-test-buffer
+ (emacs-lisp-mode)
+ ("i(one two" [return] "three" [return] "four" [return] "five" [escape] "?three" [return])
+ "(one two
+ [t]hree
+ four
+ five"
+ ("cc" "new line" [escape] "+")
+ "(one two
+ new line
+ [f]our
+ five"
+ ("cc" [escape])
+ "(one two
+ new line
+[]
+ five")))
+
+(ert-deftest evil-test-change-word ()
+ "Test changing words"
+ :tags '(evil operator)
+ (ert-info ("Non-word")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("cwABC" [escape])
+ "AB[C] This buffer is for notes."))
+ (ert-info ("Word")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("cwABC" [escape])
+ ";; AB[C] buffer is for notes."))
+ (ert-info ("Single character")
+ (evil-test-buffer
+ "[;] This buffer is for notes."
+ ("cwABC" [escape])
+ "AB[C] This buffer is for notes."))
+ (ert-info ("Whitespace")
+ (evil-test-buffer
+ "This[ ]is a test\n"
+ ("cwABC" [escape])
+ "ThisAB[C]is a test\n")))
+
+(ert-deftest evil-test-join ()
+ "Test `evil-join'"
+ :tags '(evil join operator)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f."
+ ("J")
+ ";; This buffer is for notes you don't want to save.[ ]\
+;; If you want to create a file, visit that file with C-x C-f."))
+ (ert-info ("Visual")
+ (evil-test-buffer
+ :visual line
+ "<;; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f.>"
+ ("J")
+ ";; This buffer is for notes you don't want to save.[ ]\
+;; If you want to create a file, visit that file with C-x C-f."))
+ (ert-info ("Join with count")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join 3")
+ "line 1 line 2 line 3\nline 4"))
+ (ert-info ("Join with bang and count")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join! 3")
+ "line 1line 2line 3\nline 4"))
+ (ert-info ("Join with bang and count, exceeding end-of-buffer")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join! 10")
+ "line 1line 2line 3line 4"))
+ (ert-info ("Join with count 1 should be the same as without count")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join 1")
+ "line 1 line 2\nline 3\nline 4"))
+ (ert-info ("Join with count 2 should be the same as with count 1")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":join 2")
+ "line 1 line 2\nline 3\nline 4"))
+ (ert-info ("Join with count and single line range")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":2join 3")
+ "line 1\nline 2 line 3 line 4"))
+ (ert-info ("Join with count and range")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":1,2join 3")
+ "line 1\nline 2 line 3 line 4"))
+ (ert-info ("Join with count, range and bang")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":1,2join! 3")
+ "line 1\nline 2line 3line 4"))
+ (ert-info ("Join with range")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (":1,3join")
+ "line 1 line 2 line 3\nline 4"))
+ )
+
+(ert-deftest evil-test-substitute ()
+ "Test `evil-substitute'"
+ :tags '(evil operator)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("5sABC" [escape])
+ ";; AB[C]buffer is for notes."))
+ (ert-info ("On empty line")
+ (evil-test-buffer
+ "Above some line
+\[]
+Below some empty line"
+ ("5sABC" [escape])
+ "Above some line
+AB[C]
+Below some empty line")))
+
+(ert-deftest evil-test-shift ()
+ "Test `evil-shift-right' and `evil-shift-left'."
+ :tags '(evil operator)
+ (let ((evil-shift-width 4)
+ indent-tabs-mode)
+ (ert-info ("Shift linewise")
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\n"
+ ("Vj>")
+ "[ ] line 1\n line 2\nline 3\n"))
+ (ert-info ("With `evil-start-of-line' `t'")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\n"
+ ("Vj>")
+ " [l]ine 1\n line 2\nline 3\n"))))
+ (ert-info ("Shift char selection on whole line")
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\n"
+ ("v$>")
+ " line [1]\nline 2\nline 3\n"))
+ (ert-info ("With `evil-start-of-line' `t'")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\n"
+ ("v$>")
+ " [l]ine 1\nline 2\nline 3\n"))))
+ (ert-info ("Shift visual with count")
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\n"
+ ("Vj3>")
+ "[ ] line 1\n line 2\nline 3\n"
+ ("Vj2<")
+ "[ ] line 1\n line 2\nline 3\n"))
+ (ert-info ("With `evil-start-of-line' `t'")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\n"
+ ("Vj3>")
+ " [l]ine 1\n line 2\nline 3\n"
+ ("Vj2<")
+ " [l]ine 1\n line 2\nline 3\n"))))
+ (ert-info ("Shift in insert state")
+ (evil-test-buffer
+ "line 1\nl[i]ne 2\nline 3\n"
+ ("i\C-t\C-t")
+ "line 1\n l[i]ne 2\nline 3\n"
+ ("\C-d")
+ "line 1\n l[i]ne 2\nline 3\n"))
+ (ert-info ("Delete all indentation in insert state")
+ (evil-test-buffer
+ "line1\n sometext[ ]"
+ ("a" "somemore" "0\C-d")
+ "line1\nsometext somemore[]"))))
+
+;;; Paste
+
+(ert-deftest evil-test-paste-before ()
+ "Test `evil-paste-before'"
+ :tags '(evil paste)
+ (ert-info ("Paste characters")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("y2ej0")
+ ";; This buffer is for notes you don't want to save,
+\[;]; and for Lisp evaluation."
+ ("P")
+ ";; This buffer is for notes you don't want to save,
+This buffe[r];; and for Lisp evaluation."))
+ (ert-info ("Paste characters with count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("y2ej0")
+ ";; This buffer is for notes you don't want to save,
+\[;]; and for Lisp evaluation."
+ ("3P")
+ ";; This buffer is for notes you don't want to save,
+This bufferThis bufferThis buffe[r];; and for Lisp evaluation."))
+ (ert-info ("Paste characters at end-of-buffer")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("y2eG$")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation[.]"
+ ("2P")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluationThis bufferThis buffe[r]."))
+ (ert-info ("Paste lines")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2yyP")
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."))
+ (ert-info ("Paste lines with count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2yy2P")
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."))
+ (ert-info ("Paste lines at end-of-buffer")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2yyG$")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation[.]"
+ ("2P")
+ ";; This buffer is for notes you don't want to save,
+\[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; and for Lisp evaluation."))
+ (ert-info ("Paste block")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ysP")
+ "[;]; ;; This buffer is for notes you don't want to save.
+;; ;; If you want to create a file, visit that file with C-x C-f,
+;; ;; then enter the text in that file's own buffer."))
+ (ert-info ("Paste block with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ys2P")
+ "[;]; ;; ;; This buffer is for notes you don't want to save.
+;; ;; ;; If you want to create a file, visit that file with C-x C-f,
+;; ;; ;; then enter the text in that file's own buffer."))
+ (ert-info ("Paste block with empty line")
+ (evil-test-buffer
+ "[;]; Above some line
+
+;; Below some empty line"
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ys2P")
+ "[;]; ;; ;; Above some line
+ \n\
+;; ;; ;; Below some empty line"))
+ (ert-info ("Paste block crossing end of buffer")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ysj")
+ ";; This buffer is for notes you don't want to save.
+\[;]; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("P")
+ ";; This buffer is for notes you don't want to save.
+\[;]; ;; If you want to create a file, visit that file with C-x C-f,
+;; ;; then enter the text in that file's own buffer.
+;;"))
+ (ert-info ("Paste block at end-of-line")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ys$")
+ ";; This buffer is for notes you don't want to save[.]
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("p")
+ ";; This buffer is for notes you don't want to save.[;];
+;; If you want to create a file, visit that file wi;; th C-x C-f,
+;; then enter the text in that file's own buffer. ;;")))
+
+(ert-deftest evil-test-paste-after ()
+ "Test `evil-paste-after'"
+ :tags '(evil paste)
+ (ert-info ("Paste characters")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("y2ej0")
+ ";; This buffer is for notes you don't want to save,
+\[;]; and for Lisp evaluation."
+ ("p")
+ ";; This buffer is for notes you don't want to save,
+;This buffe[r]; and for Lisp evaluation."))
+ (ert-info ("Paste characters with count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("y2ej0")
+ ";; This buffer is for notes you don't want to save,
+\[;]; and for Lisp evaluation."
+ ("3p")
+ ";; This buffer is for notes you don't want to save,
+;This bufferThis bufferThis buffe[r]; and for Lisp evaluation."))
+ (ert-info ("Paste characters at end-of-buffer")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("y2eG$")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation[.]"
+ ("2p")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.This bufferThis buffe[r]"))
+ (ert-info ("Paste lines")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2yyp")
+ ";; This buffer is for notes you don't want to save,
+\[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; and for Lisp evaluation."))
+ (ert-info ("Paste lines with count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2yy2p")
+ ";; This buffer is for notes you don't want to save,
+\[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; and for Lisp evaluation."))
+ (ert-info ("Paste lines at end-of-buffer")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("2yyG$")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation[.]"
+ ("2p")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+\[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation."))
+ (ert-info ("Paste block")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ysp")
+ ";[;]; ; This buffer is for notes you don't want to save.
+;;; ; If you want to create a file, visit that file with C-x C-f,
+;;; ; then enter the text in that file's own buffer."))
+ (ert-info ("Paste block with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ys2p")
+ ";[;]; ;; ; This buffer is for notes you don't want to save.
+;;; ;; ; If you want to create a file, visit that file with C-x C-f,
+;;; ;; ; then enter the text in that file's own buffer."))
+ (ert-info ("Paste block with empty line")
+ (evil-test-buffer
+ "[;]; Above some line
+
+;; Below some empty line"
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ys2p")
+ ";;; ;; ; Above some line
+
+;;; ;; ; Below some empty line"))
+ (ert-info ("Paste block crossing end of buffer")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ysj")
+ ";; This buffer is for notes you don't want to save.
+\[;]; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("p")
+ ";; This buffer is for notes you don't want to save.
+;;; ; If you want to create a file, visit that file with C-x C-f,
+;;; ; then enter the text in that file's own buffer.
+ ;;"))
+ (ert-info ("Paste block at end-of-line")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("3ys$")
+ ";; This buffer is for notes you don't want to save[.]
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("p")
+ ";; This buffer is for notes you don't want to save.;;
+;; If you want to create a file, visit that file wi;; th C-x C-f,
+;; then enter the text in that file's own buffer. ;;"))
+ (ert-info ("Paste preserves preceding text properties")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (put-text-property (point) (line-end-position) 'font-lock-face 'warning)
+ ("yyp")
+ ";; This buffer is for notes you don't want to save.
+[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (should (equal (get-text-property (point-min) 'font-lock-face) 'warning)))))
+
+(ert-deftest evil-test-paste-pop-before ()
+ "Test `evil-paste-pop' after `evil-paste-before'"
+ :tags '(evil paste)
+ (ert-info ("Paste")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sj")
+ ";; This buffer is for notes you don't want to save.
+\[;]; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("P")
+ ";; This buffer is for notes you don't want to save.
+\[;]; ;; If you want to create a file, visit that file with C-x C-f,
+;; ;; then enter the text in that file's own buffer.
+;;"))
+ (ert-info ("Single pop")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjP\C-p")
+ ";; This buffer is for notes you don't want to save.
+\[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Two pops")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjP\C-p\C-p")
+ ";; This buffer is for notes you don't want to save.
+;; Thi[s];; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Pop with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjP2\C-p")
+ ";; This buffer is for notes you don't want to save.
+;; Thi[s];; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Single pop-next")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjP2\C-p\C-n")
+ ";; This buffer is for notes you don't want to save.
+\[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Pop-next with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjP\C-p\C-p2\C-n")
+ ";; This buffer is for notes you don't want to save.
+\[;]; ;; If you want to create a file, visit that file with C-x C-f,
+;; ;; then enter the text in that file's own buffer.
+;;")))
+
+(ert-deftest evil-test-paste-pop-after ()
+ "Test `evil-paste-pop' after `evil-paste-after'"
+ :tags '(evil paste)
+ (ert-info ("Paste")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sj")
+ ";; This buffer is for notes you don't want to save.
+\[;]; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("p")
+ ";; This buffer is for notes you don't want to save.
+;[;]; ; If you want to create a file, visit that file with C-x C-f,
+;;; ; then enter the text in that file's own buffer.
+ ;;"))
+ (ert-info ("Single pop")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjp\C-p")
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+\[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Two pops")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjp\C-p\C-p")
+ ";; This buffer is for notes you don't want to save.
+;;; Thi[s]; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Pop with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjp2\C-p")
+ ";; This buffer is for notes you don't want to save.
+;;; Thi[s]; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Single pop-next")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjp2\C-p\C-n")
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+\[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Pop-next with count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjp\C-p\C-p2\C-n")
+ ";; This buffer is for notes you don't want to save.
+;[;]; ; If you want to create a file, visit that file with C-x C-f,
+;;; ; then enter the text in that file's own buffer.
+ ;;")))
+
+(ert-deftest evil-test-paste-pop-without-undo ()
+ "Test `evil-paste-pop' with undo disabled"
+ :tags '(evil paste)
+ (ert-info ("Pop-next with count without undo")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (setq buffer-undo-list t)
+ (define-key evil-operator-state-local-map "s" 'evil-test-square-motion)
+ ("y2e2yyy3sjP\C-p\C-p2\C-n")
+ ";; This buffer is for notes you don't want to save.
+\[;]; ;; If you want to create a file, visit that file with C-x C-f,
+;; ;; then enter the text in that file's own buffer.
+;;")))
+
+(ert-deftest evil-test-visual-paste ()
+ "Test `evil-paste-before' and `evil-paste-after' in Visual state"
+ :tags '(evil paste)
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; [I]f you want to create a file, visit that file with C-x C-f."
+ ("yyk")
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f."
+ ("VP")
+ "[;]; If you want to create a file, visit that file with C-x C-f.
+;; If you want to create a file, visit that file with C-x C-f.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f."
+ ("yyj")
+ ";; This buffer is for notes you don't want to save.
+;; [I]f you want to create a file, visit that file with C-x C-f."
+ ("Vp")
+ ";; This buffer is for notes you don't want to save.
+\[;]; This buffer is for notes you don't want to save.")
+ (ert-info ("Visual-paste from register 3")
+ ;; This behaviour deviates from vim, which populates registers 1-9 with
+ ;; deleted text only, not yanked text. This is an aspect of `evil-yank's
+ ;; use of the emacs kill-ring, so is consistent with non-visual paste.
+ (evil-test-buffer
+ "[w]ord1a word1b word1c word1d
+word2a word2b word2c word2d"
+ ("yiwwyiwwyiw")
+ "word1a word1b [w]ord1c word1d
+word2a word2b word2c word2d"
+ ("+viw\"3p")
+ "word1a word1b word1c word1d
+word1[a] word2b word2c word2d"))
+ (ert-info ("Visual-paste respects `evil-kill-on-visual-paste'")
+ (evil-test-buffer
+ "[w]ord1 word2 word3"
+ (setq evil-kill-on-visual-paste nil)
+ ("yewyew")
+ "word1 word2 [w]ord3"
+ ("ve\"2p")
+ "word1 word2 word[1]"
+ ("o\C-r\"")
+ "word1 word2 word1
+word2[]")
+ (evil-test-buffer
+ "[w]ord1 word2 word3"
+ (setq evil-kill-on-visual-paste t)
+ ("yewyew")
+ "word1 word2 [w]ord3"
+ ("ve\"2p")
+ "word1 word2 word[1]"
+ ("o\C-r\"")
+ "word1 word2 word1
+word3[]"))
+ (ert-info ("Visual-paste from `=' register")
+ (evil-test-buffer
+ "foo"
+ ("viw" "\"=p(* 6 7)" [return])
+ "4[2]"))
+ (ert-info ("Blockwise visual paste (of charwise text) with count")
+ (evil-test-buffer
+ "[a]bc\n123\n123\n123"
+ ("ye" "jl" "\C-vG" "2p")
+ "abc\n1[a]bcabc3\n1abcabc3\n1abcabc3"
+ ("gv") ;; Test point & mark are stored correctly
+ "abc\n1<abcabc3\n1abcabc3\n1abcab[c]>3"))
+ (ert-info ("Blockwise visual paste of linewise text")
+ (evil-test-buffer
+ "[a]bc\n123\n123\n123"
+ ("yy" "jl" "\C-vG" "p")
+ "abc\n1\nabc\n3\n1\nabc\n3\n1\nabc\n3")))
+
+(ert-deftest evil-test-visual-paste-pop ()
+ "Test `evil-paste-pop' after visual paste."
+ :tags '(evil paste)
+ (ert-info ("Visual-char paste, char paste")
+ (evil-test-buffer
+ "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
+ ("yiwyywyiw^jw")
+ "word1a word1b word1c\nword2a [w]ord2b\nword3a word3b word3c word3d\n"
+ ("viwp")
+ "word1a word1b word1c\nword2a word1[b]\nword3a word3b word3c word3d\n"))
+ (ert-info ("Visual-char paste, char paste, line pop")
+ (evil-test-buffer
+ "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
+ ("yiwyywyiw^jw")
+ "word1a word1b word1c\nword2a [w]ord2b\nword3a word3b word3c word3d\n"
+ ("viwp\C-p")
+ "word1a word1b word1c\nword2a \n[w]ord1a word1b word1c\n\nword3a word3b word3c word3d\n"))
+ (ert-info ("Visual-char paste, char paste, line pop, char pop")
+ (evil-test-buffer
+ "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
+ ("yiwyywyiw^jw")
+ "word1a word1b word1c\nword2a [w]ord2b\nword3a word3b word3c word3d\n"
+ ("viwp\C-p\C-p")
+ "word1a word1b word1c\nword2a word1[a]\nword3a word3b word3c word3d\n"))
+ (ert-info ("Visual-line paste, char paste")
+ (evil-test-buffer
+ "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
+ ("yiwyywyiw^j")
+ "word1a word1b word1c\n[w]ord2a word2b\nword3a word3b word3c word3d\n"
+ ("Vp")
+ "word1a word1b word1c\nword1[b]word3a word3b word3c word3d\n"))
+ (ert-info ("Visual-line paste, char paste, line pop")
+ (evil-test-buffer
+ "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
+ ("yiwyywyiw^j")
+ "word1a word1b word1c\n[w]ord2a word2b\nword3a word3b word3c word3d\n"
+ ("Vp\C-p")
+ "word1a word1b word1c\n[w]ord1a word1b word1c\nword3a word3b word3c word3d\n"))
+ (ert-info ("Visual-line paste, char paste, line pop, char pop")
+ (evil-test-buffer
+ "[w]ord1a word1b word1c\nword2a word2b\nword3a word3b word3c word3d\n"
+ ("yiwyywyiw^j")
+ "word1a word1b word1c\n[w]ord2a word2b\nword3a word3b word3c word3d\n"
+ ("Vp\C-p\C-p")
+ "word1a word1b word1c\nword1[a]word3a word3b word3c word3d\n")))
+
+(ert-deftest evil-test-register ()
+ "Test yanking and pasting to and from register."
+ :tags '(evil yank paste)
+ (ert-info ("simple lower case register")
+ (evil-test-buffer
+ "[f]oo\n"
+ ("\"ayw\"aP")
+ "fo[o]foo\n"
+ ("\"ayy\"aP")
+ "[f]oofoo\nfoofoo\n"))
+ (ert-info ("upper case register")
+ (evil-test-buffer
+ "[f]oo\n"
+ ("\"ayw\"Ayw\"aP")
+ "foofo[o]foo\n"
+ ("\"ayy\"Ayy\"aP")
+ "[f]oofoofoo\nfoofoofoo\nfoofoofoo\n"))
+ (ert-info ("upper case register and lines")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4\n"
+ ("\"a2Yjj\"A2Y\"aP")
+ "line 1\nline 2\n[l]ine 1\nline 2\nline 3\nline 4\nline 3\nline 4\n"
+ ("8G\"ap")
+ "line 1\nline 2\nline 1\nline 2\nline 3\nline 4\nline 3\nline 4\n[l]ine 1\nline 2\nline 3\nline 4\n"))
+ (ert-info ("yank with count")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\n"
+ ("\"a2yw\"aP")
+ "line [1]line 1\nline 2\nline 3\n"
+ ("\"a2yy\"aP")
+ "[l]ine 1line 1\nline 2\nline 1line 1\nline 2\nline 3\n"))
+ (dolist (module '(evil-search isearch))
+ (evil-select-search-module 'evil-search-module module)
+ (ert-info ((format "special register / (module: %s)" module))
+ (evil-test-buffer
+ "[f]oo bar\n"
+ ("/bar" [return] "0i\C-r/")
+ "bar[f]oo bar\n")))
+ (ert-info ("special register :")
+ (evil-test-buffer
+ "[f]oo bar\n"
+ (":noh\ni\C-r:")))
+ (ert-info ("Paste from register during change to register")
+ (evil-test-buffer
+ "[a]lpha beta"
+ ("\"ayiw" "w" "\"bciw" "\C-ra")
+ "alpha alpha[]"))
+ (ert-info ("Paste from register in replace state")
+ (evil-test-buffer
+ "[a]lpha bravo charlie"
+ ("yiw" "w" "R" "\C-r0")
+ "alpha alpha[ ]charlie"
+ ([backspace] [backspace] [backspace])
+ "alpha al[a]vo charlie")))
+
+(ert-deftest evil-test-last-insert-register ()
+ "Test last insertion register."
+ (evil-test-buffer
+ "[l]ine 1\n"
+ ("GiABC" [escape])
+ "line 1\nAB[C]"
+ ("go\".P")
+ "AB[C]line 1\nABC"))
+
+(ert-deftest evil-test-zero-register ()
+ "\"0 contains the last text that was yanked without specificying a register."
+ (evil-test-buffer
+ "[l]ine 1\nline 2\n"
+ ("yy\"0p")
+ "line 1\n[l]ine 1\nline 2\n"
+ ("j\"ayy\"0p")
+ "line 1\nline 1\nline 2\n[l]ine 1\n" ; yanked line 2 to "a, so "0 is still line 1
+ ("kdd\"0p")
+ "line 1\nline 1\nline 1\n[l]ine 1\n"))
+
+(ert-deftest evil-test-=-register ()
+ "\"= is not really a register . It inserts the result of evaluating some elisp"
+ (ert-info ("Can eval elisp, and can fetch default (last) result")
+ (evil-test-buffer
+ :state insert
+ "8x8= []"
+ ("\C-r=(* 8 8)" [return])
+ "8x8= 64"
+ ([return] "16x4= \C-r=" [return])
+ "8x8= 64
+16x4= 64"))
+
+ (ert-info ("Can eval infix math, and can use register at prompt")
+ (evil-test-buffer
+ "[5]0/10 * 100 = "
+ ("\"nyt=" "A\C-r=" "\C-rn" [return])
+ "50/10 * 100 = 500")))
+
+(ert-deftest evil-test-ex-put ()
+ "evil-ex-put inserts text linewise, regardless of yank-handler"
+ (ert-info ("Can put linewise text from default register, by line number")
+ (evil-test-buffer
+ "[L]orem ipsum dolor sit amet
+consectetur adipiscing elit
+sed do eiusmod tempor incididunt"
+ ("yy:2put" [return])
+ "Lorem ipsum dolor sit amet
+consectetur adipiscing elit
+[L]orem ipsum dolor sit amet
+sed do eiusmod tempor incididunt"))
+
+ (ert-info ("Can put blockwise text from letter register, backwards")
+ (evil-test-buffer
+ "Lorem ipsum [d]olor sit amet
+consectetur adipiscing elit
+sed do eiusmod tempor incididunt"
+ ("\C-vje\"xy" "bye" "Vj" ":put! x" [return])
+ "Lorem ipsum dolor sit amet
+dolor sit
+[a]dipiscing
+consectetur adipiscing elit
+sed do eiusmod tempor incididunt"))
+
+ (ert-info ("Can supply args and put from = register")
+ (evil-test-buffer
+ "[L]ine one."
+ (":put = (* 6 7)" [return])
+ "Line one.
+[4]2")))
+
+(ert-deftest evil-test-align ()
+ "Test `evil-align-left', `evil-align-right' and `evil-align-center'."
+ :tags '(evil operator)
+ (evil-without-display
+ (let ((fill-column 70)
+ indent-tabs-mode)
+ (evil-test-buffer
+ "before\n[l]ine 1\nthis is line number 2\nline number 3\nafter\n"
+ (":.,+2ri" [return] (kbd "M-x") "untabify" [return])
+ "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"
+ (":.,+2ri 60" [return] (kbd "M-x") "untabify" [return])
+ "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"
+ (":.,+2le" [return] (kbd "M-x") "untabify" [return])
+ "before\n[l]ine 1\nthis is line number 2\nline number 3\nafter\n"
+ (":.,+2le 10" [return])
+ "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"
+ (":.,+2ce" [return] (kbd "M-x") "untabify" [return])
+ "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"
+ (":.,+2ce 40" [return] (kbd "M-x") "untabify" [return])
+ "before\n [l]ine 1\n this is line number 2\n line number 3\nafter\n"))))
+
+;;; Motions
+
+(ert-deftest evil-test-forward-char ()
+ "Test `evil-forward-char' motion"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("l")
+ ";[;] This buffer is for notes."))
+ (ert-info ("End of line")
+ (let ((evil-cross-lines t)
+ (evil-move-beyond-eol nil))
+ (evil-test-buffer
+ ";; This buffer is for notes[,]
+;; and for Lisp evaluation."
+ ("l")
+ ";; This buffer is for notes,
+\[;]; and for Lisp evaluation.")))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("12l")
+ ";; This buff[e]r is for notes."))
+ (ert-info ("End of line")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ (should-error (execute-kbd-macro "l"))
+ (should-error (execute-kbd-macro "10l"))))
+ (ert-info ("Until end-of-line")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("100l")
+ ";; This buffer is for notes[.]"))
+ (ert-info ("On empty line")
+ (evil-test-buffer
+ "Above some line
+\[]
+Below some empty line"
+ (should-error (execute-kbd-macro "l"))
+ (should-error (execute-kbd-macro "42l")))))
+
+(ert-deftest evil-test-backward-char ()
+ "Test `evil-backward-char' motion"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; This[ ]buffer is for notes."
+ ("h")
+ ";; Thi[s] buffer is for notes."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; This[ ]buffer is for notes."
+ ("3h")
+ ";; T[h]is buffer is for notes."))
+ (ert-info ("Beginning of line")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ (should-error (execute-kbd-macro "h"))
+ (should-error (execute-kbd-macro "10h"))))
+ (ert-info ("Until beginning-of-line")
+ (evil-test-buffer
+ ";; This[ ]buffer is for notes."
+ ("100h")
+ "[;]; This buffer is for notes."))
+ (ert-info ("On empty line")
+ (evil-test-buffer
+ "Above some line
+\[]
+Below some empty line"
+ (should-error (execute-kbd-macro "h"))
+ (should-error (execute-kbd-macro "42h")))))
+
+(ert-deftest evil-test-previous-line ()
+ "Test `evil-previous-line' motion"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save,
+;; [a]nd for Lisp evaluation."
+ ("k")
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; [t]hen enter the text in that file's own buffer."
+ ("2k")
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("Until beginning of buffer")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; [t]hen enter the text in that file's own buffer."
+ ("100k")
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."))
+ (ert-info ("At beginning of buffer")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ (should-error (execute-kbd-macro "k"))
+ (should-error (execute-kbd-macro "42k")))))
+
+(ert-deftest evil-test-next-line ()
+ "Test `evil-next-line' motion"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("j")
+ ";; This buffer is for notes you don't want to save,
+;; [a]nd for Lisp evaluation."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("2j")
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; [t]hen enter the text in that file's own buffer."))
+ (ert-info ("Until end of buffer")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("100j")
+ ";; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; [t]hen enter the text in that file's own buffer."))
+ (ert-info ("At end of buffer")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to [s]ave."
+ (should-error (execute-kbd-macro "j"))
+ (should-error (execute-kbd-macro "42j")))))
+
+(ert-deftest evil-test-next+previous-preserve-column ()
+ "Test `evil-previous-line' and `evil-next-line' preserve the column."
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "ab[c]\nabcdef\n\nabcd\n"
+ ("j")
+ "abc\nab[c]def\n\nabcd\n")
+ (evil-test-buffer
+ "ab[c]\nabcdef\n\nabcd\n"
+ ("jj")
+ "abc\nabcdef\n[\n]abcd\n")
+ (evil-test-buffer
+ "ab[c]\nabcdef\n\nabcd\n"
+ ("jjj")
+ "abc\nabcdef\n\nab[c]d\n")
+ (evil-test-buffer
+ "ab[c]\nabcdef\n\nabcd\n"
+ ("jjjk")
+ "abc\nabcdef\n[\n]abcd\n")
+ (evil-test-buffer
+ "ab[c]\nabcdef\n\nabcd\n"
+ ("jjjkk")
+ "abc\nab[c]def\n\nabcd\n")))
+
+(ert-deftest evil-test-other-commands-preserve-column ()
+ "Test other comamnds preserve the column, when appropriate."
+ :tags '(evil motion)
+ (ert-info ("evil-goto-line can preserve column")
+ (let ((evil-start-of-line nil))
+ (evil-test-buffer
+ "Shor[t] line
+Average line
+The longest line"
+ ("2G")
+ "Short line
+Aver[a]ge line
+The longest line"
+ ("$G")
+ "Short line
+Average line
+The longest lin[e]"
+ ("hgg")
+ "Short lin[e]
+Average line
+The longest line")))
+
+ (ert-info ("evil-goto-line respects evil-start-of-line")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ "foo\n[b]ar"
+ ("$ggj")
+ "foo\n[b]ar")))
+
+ (ert-info ("N% (`evil-jump-item' with count) can preserve column")
+ (let ((evil-start-of-line nil))
+ (evil-test-buffer
+ "Short line
+Average line
+The lo[n]gest line"
+ ("5%")
+ "Short [l]ine
+Average line
+The longest line"
+ ("$90%")
+ "Short line
+Average line
+The longest lin[e]"))))
+
+(ert-deftest evil-test-beginning-of-line ()
+ "Test `evil-beginning-of-line' motion"
+ :tags '(evil motion)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("0")
+ "[;]; This buffer is for notes you don't want to save."
+ ("0")
+ "[;]; This buffer is for notes you don't want to save."))
+
+(ert-deftest evil-test-end-of-line ()
+ "Test `evil-end-of-line' motion"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save."
+ ("$")
+ ";; This buffer is for notes you don't want to save[.]"
+ ("$")
+ ";; This buffer is for notes you don't want to save[.]"))
+ (ert-info ("Don't delete blank lines")
+ (evil-test-buffer
+ "Above some line
+\[]
+Below some empty line"
+ ("d$")
+ "Above some line
+\[]
+Below some empty line")))
+
+(ert-deftest evil-test-percentage-of-line ()
+ "Test `evil-percentage-of-line' motion"
+ :tags '(evil motion)
+ (evil-test-buffer
+ "[0]123456789"
+ ("gM")
+ "01234[5]6789"
+ ("10gM")
+ "0[1]23456789"
+ ("85gM")
+ "01234567[8]9"))
+
+(ert-deftest evil-test-first-non-blank ()
+ "Test `evil-first-non-blank' motion"
+ :tags '(evil motion)
+ (evil-test-buffer
+ "\
+ printf(\"Hello world\\n\")[;]
+ return EXIT_SUCCESS;"
+ ("^")
+ "\
+ [p]rintf(\"Hello world\\n\");
+ return EXIT_SUCCESS;"
+ ("j^")
+ "\
+ printf(\"Hello world\\n\");
+ [r]eturn EXIT_SUCCESS;"))
+
+(ert-deftest evil-test-last-non-blank ()
+ "Test `evil-last-non-blank' motion"
+ :tags '(evil motion)
+ (evil-test-buffer
+ "[i]nt main(int argc, char** argv) \n\
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("g_")
+ "int main(int argc, char** argv[)] \n\
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("jjg_")
+ "int main(int argc, char** argv) \n\
+{
+ printf(\"Hello world\\n\")[;]
+ return EXIT_SUCCESS;
+}"))
+
+(ert-deftest evil-test-goto-first-line ()
+ "Test `evil-goto-first-line' motion"
+ :tags '(evil motion)
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (evil-test-buffer
+ "[i]nt main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("3gg")
+ "int main(int argc, char** argv)
+{
+[ ] printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("gg")
+ "[i]nt main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("100gg")
+ "int main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+\[}]"))
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ "[i]nt main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("3gg")
+ "int main(int argc, char** argv)
+{
+ [p]rintf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("gg")
+ "[i]nt main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("100gg")
+ "int main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+\[}]"))))
+
+(ert-deftest evil-test-goto-line ()
+ "Test `evil-goto-line' motion"
+ :tags '(evil motion)
+ (ert-info ("With `evil-start-of-line' `t'")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ "[i]nt main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("G")
+ "int main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+\[}]"
+ ("3G")
+ "int main(int argc, char** argv)
+{
+ [p]rintf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("100G")
+ "int main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+\[}]")))
+ (ert-info ("With `evil-start-of-line' `nil'")
+ (evil-test-buffer
+ "[i]nt main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("G")
+ "int main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+\[}]"
+ ("3G")
+ "int main(int argc, char** argv)
+{
+[ ] printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("100G")
+ "int main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+\[}]")))
+
+(ert-deftest evil-test-goto-char ()
+ "Test `evil-goto-char' motion and ex command."
+ :tags '(evil motion ex)
+ (evil-test-buffer
+ "[W]e only need a short buffer for this test"
+ (":goto 9")
+ "We only [n]eed a short buffer for this test"
+ (":goto")
+ "[W]e only need a short buffer for this test"
+ ("16go")
+ "We only need a [s]hort buffer for this test"
+ ("go")
+ "[W]e only need a short buffer for this test"
+ (evil-goto-char 24)
+ "We only need a short bu[f]fer for this test"))
+
+(ert-deftest evil-test-operator-0 ()
+ "Test motion \"0\" with an operator."
+ :tags '(evil motion)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("d0")
+ "[T]his buffer is for notes."))
+
+(ert-deftest evil-test-forward-not-word ()
+ "Test `evil-forward-not-thing'"
+ :tags '(evil motion)
+ (evil-test-buffer
+ "[ ] aa,,"
+ (evil-forward-not-thing 'evil-word)
+ " [a]a,,"))
+
+;; TODO: test Visual motions and window motions
+(ert-deftest evil-test-forward-word-begin ()
+ "Test `evil-forward-word-begin'"
+ :tags '(evil motion)
+ (ert-info ("Non-word")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("w")
+ ";; [T]his buffer is for notes."))
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("w")
+ ";; This [b]uffer is for notes."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("3w")
+ ";; This buffer is [f]or notes."))
+ (ert-info ("With count on whitespace")
+ (evil-test-buffer
+ ";;[ ]This buffer is for notes."
+ ("3w")
+ ";; This buffer [i]s for notes."))
+ (ert-info ("Empty line")
+ (evil-test-buffer
+ "Above some line
+\[]
+Below some empty line"
+ ("w")
+ "Above some line
+
+\[B]elow some empty line")
+ (evil-test-buffer
+ "[A]bove
+
+Below some empty line"
+ ("dw")
+ "[]
+
+Below some empty line"
+ ("dw")
+ "[]
+Below some empty line"
+ ("dw")
+ "[B]elow some empty line")
+ (evil-test-buffer
+ "[A]bove
+
+ Below some empty line with leading whitespace"
+ ("dw")
+ "[]
+
+ Below some empty line with leading whitespace"
+ ("dw")
+ "[]
+ Below some empty line with leading whitespace"
+ ("dw")
+ " [B]elow some empty line")
+ (evil-test-buffer
+ "Some line with trailing whitespace [ ] \n next line\n"
+ ("dw")
+ "Some line with trailing whitespace [ ]\n next line\n")
+ (evil-test-buffer
+ "[A]\n"
+ ("dw")
+ "[]\n"))
+ (ert-info ("End of buffer")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("100w")
+ ";; This buffer is for notes[.]"
+ (should-error (execute-kbd-macro "w"))
+ (should-error (execute-kbd-macro "10w"))))
+ (ert-info ("Before last character in buffer")
+ (evil-test-buffer
+ "fo[o]."
+ ("w")
+ "foo[.]")
+ (evil-test-buffer
+ "fo[o] "
+ ("w")
+ "foo[ ]")
+ (evil-test-buffer
+ "[ ]e"
+ ("w")
+ " [e]")))
+
+(ert-deftest evil-test-forward-word-end ()
+ "Test `evil-forward-word-end'"
+ :tags '(evil motion)
+ (ert-info ("Non-word")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("e")
+ ";[;] This buffer is for notes."))
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("e")
+ ";; Thi[s] buffer is for notes."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("3e")
+ ";; This buffer i[s] for notes."))
+ (ert-info ("With count on whitespace")
+ (evil-test-buffer
+ ";;[ ]This buffer is for notes."
+ ("3e")
+ ";; This buffer i[s] for notes."))
+ (ert-info ("Delete")
+ (evil-test-buffer
+ ";; This[-]buffer-is-for-notes."
+ ("de")
+ ";; This[-]is-for-notes."))
+ (ert-info ("Empty line")
+ (evil-test-buffer
+ "Above some line
+\[]
+Below some empty line"
+ ("e")
+ "Above some line
+
+Belo[w] some empty line"))
+ (ert-info ("End of buffer")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("100e")
+ ";; This buffer is for notes[.]"
+ (should-error (execute-kbd-macro "e"))
+ (should-error (execute-kbd-macro "10e"))))
+ ;; In Vim, "de" may delete two words rather than one
+ ;; if the first word is only one letter. In Evil,
+ ;; "de" always deletes one word.
+ (ert-info ("Delete a single-letter word")
+ (evil-test-buffer
+ "a [b] c"
+ ("de")
+ "a [ ]c")))
+
+(ert-deftest evil-test-backward-word-begin ()
+ "Test `evil-backward-word-begin'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("b")
+ ";; This buffer is for [n]otes."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("2b")
+ ";; This buffer is [f]or notes."))
+ (ert-info ("Empty line")
+ (evil-test-buffer
+ "Above some line
+\[]
+Below some empty line"
+ ("b")
+ "Above some [l]ine
+
+Below some empty line"))
+ (ert-info ("With count on whitespace")
+ (evil-test-buffer
+ ";; This buffer is for[ ]notes."
+ ("2b")
+ ";; This buffer [i]s for notes."))
+ (ert-info ("Beginning of buffer")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("100b")
+ "[;]; This buffer is for notes."
+ (should-error (execute-kbd-macro "b"))
+ (should-error (execute-kbd-macro "10b")))))
+
+(ert-deftest evil-test-backward-word-end ()
+ "Test `evil-backward-word-end'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("ge")
+ ";; This buffer is for note[s]."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("2ge")
+ ";; This buffer is fo[r] notes."))
+ (ert-info ("Empty line")
+ (evil-test-buffer
+ "Above some line
+\[]
+Below some empty line"
+ ("ge")
+ "Above some lin[e]
+
+Below some empty line"))
+ (ert-info ("With count on whitespace")
+ (evil-test-buffer
+ ";; This buffer is for[ ]notes."
+ ("2ge")
+ ";; This buffer i[s] for notes."))
+ (ert-info ("Beginning of buffer")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("100ge")
+ "[;]; This buffer is for notes."
+ (should-error (execute-kbd-macro "ge"))
+ (should-error (execute-kbd-macro "10ge")))))
+
+(ert-deftest evil-test-forward-word-begin-cjk ()
+ "Test `evil-forward-word-begin' on CJK words"
+ :tags '(evil motion cjk)
+ (ert-info ("Latin / numeric")
+ (evil-test-buffer
+ "[a]bcd1234"
+ ("w")
+ "abcd123[4]"))
+ (ert-info ("Latin / Kanji")
+ (evil-test-buffer
+ "[a]bcd漢字"
+ ("w")
+ "abcd[漢]字"))
+ (ert-info ("Latin / Hiragana")
+ (evil-test-buffer
+ "[a]bcdひらがな"
+ ("w")
+ "abcd[ひ]らがな"))
+ (ert-info ("Latin / Katakana")
+ (evil-test-buffer
+ "[a]bcdカタカナ"
+ ("w")
+ "abcd[カ]タカナ"))
+ (ert-info ("Latin / half-width Katakana")
+ (evil-test-buffer
+ "[a]bcdカタカナ"
+ ("w")
+ "abcdカタカ[ナ]"))
+ (ert-info ("Latin / full-width alphabet")
+ (evil-test-buffer
+ "[a]bcdABC"
+ ("w")
+ "abcdAB[C]"))
+ (ert-info ("Latin / full-width numeric")
+ (evil-test-buffer
+ "[a]bcd123"
+ ("w")
+ "abcd12[3]"))
+ (ert-info ("Latin / Hangul")
+ (evil-test-buffer
+ "[a]bcd한글"
+ ("w")
+ "abcd[한]글"))
+ (ert-info ("numeric / Latin")
+ (evil-test-buffer
+ "[1]234abcd"
+ ("w")
+ "1234abc[d]"))
+ (ert-info ("numeric / Kanji")
+ (evil-test-buffer
+ "[1]234漢字"
+ ("w")
+ "1234[漢]字"))
+ (ert-info ("numeric / Hiragana")
+ (evil-test-buffer
+ "[1]234ひらがな"
+ ("w")
+ "1234[ひ]らがな"))
+ (ert-info ("numeric / Katakana")
+ (evil-test-buffer
+ "[1]234カタカナ"
+ ("w")
+ "1234[カ]タカナ"))
+ (ert-info ("numeric / half-width Katakana")
+ (evil-test-buffer
+ "[1]234カタカナ"
+ ("w")
+ "1234カタカ[ナ]"))
+ (ert-info ("numeric / full-width alphabet")
+ (evil-test-buffer
+ "[1]234ABC"
+ ("w")
+ "1234AB[C]"))
+ (ert-info ("numeric / full-width numeric")
+ (evil-test-buffer
+ "[1]234123"
+ ("w")
+ "123412[3]"))
+ (ert-info ("numeric / Hangul")
+ (evil-test-buffer
+ "[1]234한글"
+ ("w")
+ "1234[한]글"))
+ (ert-info ("Kanji / Latin")
+ (evil-test-buffer
+ "[漢]字abcd"
+ ("w")
+ "漢字[a]bcd"))
+ (ert-info ("Kanji / numeric")
+ (evil-test-buffer
+ "[漢]字1234"
+ ("w")
+ "漢字[1]234"))
+ (ert-info ("Kanji / Hiragana")
+ (evil-test-buffer
+ "[漢]字ひらがな"
+ ("w")
+ "漢字[ひ]らがな"))
+ (ert-info ("Kanji / Katakana")
+ (evil-test-buffer
+ "[漢]字カタカナ"
+ ("w")
+ "漢字[カ]タカナ"))
+ (ert-info ("Kanji / half-width Katakana")
+ (evil-test-buffer
+ "[漢]字カタカナ"
+ ("w")
+ "漢字[カ]タカナ"))
+ (ert-info ("Kanji / full-width alphabet")
+ (evil-test-buffer
+ "[漢]字ABC"
+ ("w")
+ "漢字[A]BC"))
+ (ert-info ("Kanji / full-width numeric")
+ (evil-test-buffer
+ "[漢]字123"
+ ("w")
+ "漢字[1]23"))
+ (ert-info ("Kanji / Hangul")
+ (evil-test-buffer
+ "[漢]字한글"
+ ("w")
+ "漢字[한]글"))
+ (ert-info ("Hiragana / Latin")
+ (evil-test-buffer
+ "[ひ]らがなabcd"
+ ("w")
+ "ひらがな[a]bcd"))
+ (ert-info ("Hiragana / numeric")
+ (evil-test-buffer
+ "[ひ]らがな1234"
+ ("w")
+ "ひらがな[1]234"))
+ (ert-info ("Hiragana / Kanji")
+ (evil-test-buffer
+ "[ひ]らがな漢字"
+ ("w")
+ "ひらがな[漢]字"))
+ (ert-info ("Hiragana / Katakana")
+ (evil-test-buffer
+ "[ひ]らがなカタカナ"
+ ("w")
+ "ひらがな[カ]タカナ"))
+ (ert-info ("Hiragana / half-width Katakana")
+ (evil-test-buffer
+ "[ひ]らがなカタカナ"
+ ("w")
+ "ひらがな[カ]タカナ"))
+ (ert-info ("Hiragana / full-width alphabet")
+ (evil-test-buffer
+ "[ひ]らがなABC"
+ ("w")
+ "ひらがな[A]BC"))
+ (ert-info ("Hiragana / full-width numeric")
+ (evil-test-buffer
+ "[ひ]らがな123"
+ ("w")
+ "ひらがな[1]23"))
+ (ert-info ("Hiragana / Hangul")
+ (evil-test-buffer
+ "[ひ]らがな한글"
+ ("w")
+ "ひらがな[한]글"))
+ (ert-info ("Katakana / Latin")
+ (evil-test-buffer
+ "[カ]タカナabcd"
+ ("w")
+ "カタカナ[a]bcd"))
+ (ert-info ("Katakana / numeric")
+ (evil-test-buffer
+ "[カ]タカナ1234"
+ ("w")
+ "カタカナ[1]234"))
+ (ert-info ("Katakana / Kanji")
+ (evil-test-buffer
+ "[カ]タカナ漢字"
+ ("w")
+ "カタカナ[漢]字"))
+ (ert-info ("Katakana / Hiragana")
+ (evil-test-buffer
+ "[カ]タカナひらがな"
+ ("w")
+ "カタカナ[ひ]らがな"))
+ (ert-info ("Katakana / half-width Katakana")
+ (evil-test-buffer
+ "[カ]タカナカタカナ"
+ ("w")
+ "カタカナ[カ]タカナ"))
+ (ert-info ("Katakana / full-width alphabet")
+ (evil-test-buffer
+ "[カ]タカナABC"
+ ("w")
+ "カタカナ[A]BC"))
+ (ert-info ("Katakana / full-width numeric")
+ (evil-test-buffer
+ "[カ]タカナ123"
+ ("w")
+ "カタカナ[1]23"))
+ (ert-info ("Katakana / Hangul")
+ (evil-test-buffer
+ "[カ]タカナ한글"
+ ("w")
+ "カタカナ[한]글"))
+ (ert-info ("half-width Katakana / Latin")
+ (evil-test-buffer
+ "[カ]タカナabcd"
+ ("w")
+ "カタカナabc[d]"))
+ (ert-info ("half-width Katakana / numeric")
+ (evil-test-buffer
+ "[カ]タカナ1234"
+ ("w")
+ "カタカナ123[4]"))
+ (ert-info ("half-width Katakana / Kanji")
+ (evil-test-buffer
+ "[カ]タカナ漢字"
+ ("w")
+ "カタカナ[漢]字"))
+ (ert-info ("half-width Katakana / Hiragana")
+ (evil-test-buffer
+ "[カ]タカナひらがな"
+ ("w")
+ "カタカナ[ひ]らがな"))
+ (ert-info ("half-width Katakana / Katakana")
+ (evil-test-buffer
+ "[カ]タカナカタカナ"
+ ("w")
+ "カタカナ[カ]タカナ"))
+ (ert-info ("half-width Katakana / full-width alphabet")
+ (evil-test-buffer
+ "[カ]タカナABC"
+ ("w")
+ "カタカナAB[C]"))
+ (ert-info ("half-width Katakana / full-width numeric")
+ (evil-test-buffer
+ "[カ]タカナ123"
+ ("w")
+ "カタカナ12[3]"))
+ (ert-info ("half-width Katakana / Hangul")
+ (evil-test-buffer
+ "[カ]タカナ한글"
+ ("w")
+ "カタカナ[한]글"))
+ (ert-info ("full-width alphabet / Latin")
+ (evil-test-buffer
+ "[A]BCabcd"
+ ("w")
+ "ABCabc[d]"))
+ (ert-info ("full-width alphabet / numeric")
+ (evil-test-buffer
+ "[A]BC1234"
+ ("w")
+ "ABC123[4]"))
+ (ert-info ("full-width alphabet / Kanji")
+ (evil-test-buffer
+ "[A]BC漢字"
+ ("w")
+ "ABC[漢]字"))
+ (ert-info ("full-width alphabet / Hiragana")
+ (evil-test-buffer
+ "[A]BCひらがな"
+ ("w")
+ "ABC[ひ]らがな"))
+ (ert-info ("full-width alphabet / Katakana")
+ (evil-test-buffer
+ "[A]BCカタカナ"
+ ("w")
+ "ABC[カ]タカナ"))
+ (ert-info ("full-width alphabet / half-width Katakana")
+ (evil-test-buffer
+ "[A]BCカタカナ"
+ ("w")
+ "ABCカタカ[ナ]"))
+ (ert-info ("full-width alphabet / full-width numeric")
+ (evil-test-buffer
+ "[A]BC123"
+ ("w")
+ "ABC12[3]"))
+ (ert-info ("full-width alphabet / Hangul")
+ (evil-test-buffer
+ "[A]BC한글"
+ ("w")
+ "ABC[한]글"))
+ (ert-info ("full-width numeric / Latin")
+ (evil-test-buffer
+ "[1]23abcd"
+ ("w")
+ "123abc[d]"))
+ (ert-info ("full-width numeric / numeric")
+ (evil-test-buffer
+ "[1]231234"
+ ("w")
+ "123123[4]"))
+ (ert-info ("full-width numeric / Kanji")
+ (evil-test-buffer
+ "[1]23漢字"
+ ("w")
+ "123[漢]字"))
+ (ert-info ("full-width numeric / Hiragana")
+ (evil-test-buffer
+ "[1]23ひらがな"
+ ("w")
+ "123[ひ]らがな"))
+ (ert-info ("full-width numeric / Katakana")
+ (evil-test-buffer
+ "[1]23カタカナ"
+ ("w")
+ "123[カ]タカナ"))
+ (ert-info ("full-width numeric / half-width Katakana")
+ (evil-test-buffer
+ "[1]23カタカナ"
+ ("w")
+ "123カタカ[ナ]"))
+ (ert-info ("full-width numeric / full-width alphabet")
+ (evil-test-buffer
+ "[1]23ABC"
+ ("w")
+ "123AB[C]"))
+ (ert-info ("full-width numeric / Hangul")
+ (evil-test-buffer
+ "[1]23한글"
+ ("w")
+ "123[한]글"))
+ (ert-info ("Hangul / Latin")
+ (evil-test-buffer
+ "[한]글abcd"
+ ("w")
+ "한글[a]bcd"))
+ (ert-info ("Hangul / numeric")
+ (evil-test-buffer
+ "[한]글1234"
+ ("w")
+ "한글[1]234"))
+ (ert-info ("Hangul / Kanji")
+ (evil-test-buffer
+ "[한]글漢字"
+ ("w")
+ "한글[漢]字"))
+ (ert-info ("Hangul / Hiragana")
+ (evil-test-buffer
+ "[한]글ひらがな"
+ ("w")
+ "한글[ひ]らがな"))
+ (ert-info ("Hangul / Katakana")
+ (evil-test-buffer
+ "[한]글カタカナ"
+ ("w")
+ "한글[カ]タカナ"))
+ (ert-info ("Hangul / half-width Katakana")
+ (evil-test-buffer
+ "[한]글カタカナ"
+ ("w")
+ "한글[カ]タカナ"))
+ (ert-info ("Hangul / full-width alphabet")
+ (evil-test-buffer
+ "[한]글ABC"
+ ("w")
+ "한글[A]BC"))
+ (ert-info ("Hangul / full-width numeric")
+ (evil-test-buffer
+ "[한]글123"
+ ("w")
+ "한글[1]23")))
+
+(ert-deftest evil-test-forward-word-end-cjk ()
+ "Test `evil-forward-word-end' on CJK words"
+ :tags '(evil motion cjk)
+ (ert-info ("Latin / numeric")
+ (evil-test-buffer
+ "[a]bcd1234"
+ ("e")
+ "abcd123[4]"))
+ (ert-info ("Latin / Kanji")
+ (evil-test-buffer
+ "[a]bcd漢字"
+ ("e")
+ "abc[d]漢字"))
+ (ert-info ("Latin / Hiragana")
+ (evil-test-buffer
+ "[a]bcdひらがな"
+ ("e")
+ "abc[d]ひらがな"))
+ (ert-info ("Latin / Katakana")
+ (evil-test-buffer
+ "[a]bcdカタカナ"
+ ("e")
+ "abc[d]カタカナ"))
+ (ert-info ("Latin / half-width Katakana")
+ (evil-test-buffer
+ "[a]bcdカタカナ"
+ ("e")
+ "abcdカタカ[ナ]"))
+ (ert-info ("Latin / full-width alphabet")
+ (evil-test-buffer
+ "[a]bcdABC"
+ ("e")
+ "abcdAB[C]"))
+ (ert-info ("Latin / full-width numeric")
+ (evil-test-buffer
+ "[a]bcd123"
+ ("e")
+ "abcd12[3]"))
+ (ert-info ("Latin / Hangul")
+ (evil-test-buffer
+ "[a]bcd한글"
+ ("e")
+ "abc[d]한글"))
+ (ert-info ("numeric / Latin")
+ (evil-test-buffer
+ "[1]234abcd"
+ ("e")
+ "1234abc[d]"))
+ (ert-info ("numeric / Kanji")
+ (evil-test-buffer
+ "[1]234漢字"
+ ("e")
+ "123[4]漢字"))
+ (ert-info ("numeric / Hiragana")
+ (evil-test-buffer
+ "[1]234ひらがな"
+ ("e")
+ "123[4]ひらがな"))
+ (ert-info ("numeric / Katakana")
+ (evil-test-buffer
+ "[1]234カタカナ"
+ ("e")
+ "123[4]カタカナ"))
+ (ert-info ("numeric / half-width Katakana")
+ (evil-test-buffer
+ "[1]234カタカナ"
+ ("e")
+ "1234カタカ[ナ]"))
+ (ert-info ("numeric / full-width alphabet")
+ (evil-test-buffer
+ "[1]234ABC"
+ ("e")
+ "1234AB[C]"))
+ (ert-info ("numeric / full-width numeric")
+ (evil-test-buffer
+ "[1]234123"
+ ("e")
+ "123412[3]"))
+ (ert-info ("numeric / Hangul")
+ (evil-test-buffer
+ "[1]234한글"
+ ("e")
+ "123[4]한글"))
+ (ert-info ("Kanji / Latin")
+ (evil-test-buffer
+ "[漢]字abcd"
+ ("e")
+ "漢[字]abcd"))
+ (ert-info ("Kanji / numeric")
+ (evil-test-buffer
+ "[漢]字1234"
+ ("e")
+ "漢[字]1234"))
+ (ert-info ("Kanji / Hiragana")
+ (evil-test-buffer
+ "[漢]字ひらがな"
+ ("e")
+ "漢[字]ひらがな"))
+ (ert-info ("Kanji / Katakana")
+ (evil-test-buffer
+ "[漢]字カタカナ"
+ ("e")
+ "漢[字]カタカナ"))
+ (ert-info ("Kanji / half-width Katakana")
+ (evil-test-buffer
+ "[漢]字カタカナ"
+ ("e")
+ "漢[字]カタカナ"))
+ (ert-info ("Kanji / full-width alphabet")
+ (evil-test-buffer
+ "[漢]字ABC"
+ ("e")
+ "漢[字]ABC"))
+ (ert-info ("Kanji / full-width numeric")
+ (evil-test-buffer
+ "[漢]字123"
+ ("e")
+ "漢[字]123"))
+ (ert-info ("Kanji / Hangul")
+ (evil-test-buffer
+ "[漢]字한글"
+ ("e")
+ "漢[字]한글"))
+ (ert-info ("Hiragana / Latin")
+ (evil-test-buffer
+ "[ひ]らがなabcd"
+ ("e")
+ "ひらが[な]abcd"))
+ (ert-info ("Hiragana / numeric")
+ (evil-test-buffer
+ "[ひ]らがな1234"
+ ("e")
+ "ひらが[な]1234"))
+ (ert-info ("Hiragana / Kanji")
+ (evil-test-buffer
+ "[ひ]らがな漢字"
+ ("e")
+ "ひらが[な]漢字"))
+ (ert-info ("Hiragana / Katakana")
+ (evil-test-buffer
+ "[ひ]らがなカタカナ"
+ ("e")
+ "ひらが[な]カタカナ"))
+ (ert-info ("Hiragana / half-width Katakana")
+ (evil-test-buffer
+ "[ひ]らがなカタカナ"
+ ("e")
+ "ひらが[な]カタカナ"))
+ (ert-info ("Hiragana / full-width alphabet")
+ (evil-test-buffer
+ "[ひ]らがなABC"
+ ("e")
+ "ひらが[な]ABC"))
+ (ert-info ("Hiragana / full-width numeric")
+ (evil-test-buffer
+ "[ひ]らがな123"
+ ("e")
+ "ひらが[な]123"))
+ (ert-info ("Hiragana / Hangul")
+ (evil-test-buffer
+ "[ひ]らがな한글"
+ ("e")
+ "ひらが[な]한글"))
+ (ert-info ("Katakana / Latin")
+ (evil-test-buffer
+ "[カ]タカナabcd"
+ ("e")
+ "カタカ[ナ]abcd"))
+ (ert-info ("Katakana / numeric")
+ (evil-test-buffer
+ "[カ]タカナ1234"
+ ("e")
+ "カタカ[ナ]1234"))
+ (ert-info ("Katakana / Kanji")
+ (evil-test-buffer
+ "[カ]タカナ漢字"
+ ("e")
+ "カタカ[ナ]漢字"))
+ (ert-info ("Katakana / Hiragana")
+ (evil-test-buffer
+ "[カ]タカナひらがな"
+ ("e")
+ "カタカ[ナ]ひらがな"))
+ (ert-info ("Katakana / half-width Katakana")
+ (evil-test-buffer
+ "[カ]タカナカタカナ"
+ ("e")
+ "カタカ[ナ]カタカナ"))
+ (ert-info ("Katakana / full-width alphabet")
+ (evil-test-buffer
+ "[カ]タカナABC"
+ ("e")
+ "カタカ[ナ]ABC"))
+ (ert-info ("Katakana / full-width numeric")
+ (evil-test-buffer
+ "[カ]タカナ123"
+ ("e")
+ "カタカ[ナ]123"))
+ (ert-info ("Katakana / Hangul")
+ (evil-test-buffer
+ "[カ]タカナ한글"
+ ("e")
+ "カタカ[ナ]한글"))
+ (ert-info ("half-width Katakana / Latin")
+ (evil-test-buffer
+ "[カ]タカナabcd"
+ ("e")
+ "カタカナabc[d]"))
+ (ert-info ("half-width Katakana / numeric")
+ (evil-test-buffer
+ "[カ]タカナ1234"
+ ("e")
+ "カタカナ123[4]"))
+ (ert-info ("half-width Katakana / Kanji")
+ (evil-test-buffer
+ "[カ]タカナ漢字"
+ ("e")
+ "カタカ[ナ]漢字"))
+ (ert-info ("half-width Katakana / Hiragana")
+ (evil-test-buffer
+ "[カ]タカナひらがな"
+ ("e")
+ "カタカ[ナ]ひらがな"))
+ (ert-info ("half-width Katakana / Katakana")
+ (evil-test-buffer
+ "[カ]タカナカタカナ"
+ ("e")
+ "カタカ[ナ]カタカナ"))
+ (ert-info ("half-width Katakana / full-width alphabet")
+ (evil-test-buffer
+ "[カ]タカナABC"
+ ("e")
+ "カタカナAB[C]"))
+ (ert-info ("half-width Katakana / full-width numeric")
+ (evil-test-buffer
+ "[カ]タカナ123"
+ ("e")
+ "カタカナ12[3]"))
+ (ert-info ("half-width Katakana / Hangul")
+ (evil-test-buffer
+ "[カ]タカナ한글"
+ ("e")
+ "カタカ[ナ]한글"))
+ (ert-info ("full-width alphabet / Latin")
+ (evil-test-buffer
+ "[A]BCabcd"
+ ("e")
+ "ABCabc[d]"))
+ (ert-info ("full-width alphabet / numeric")
+ (evil-test-buffer
+ "[A]BC1234"
+ ("e")
+ "ABC123[4]"))
+ (ert-info ("full-width alphabet / Kanji")
+ (evil-test-buffer
+ "[A]BC漢字"
+ ("e")
+ "AB[C]漢字"))
+ (ert-info ("full-width alphabet / Hiragana")
+ (evil-test-buffer
+ "[A]BCひらがな"
+ ("e")
+ "AB[C]ひらがな"))
+ (ert-info ("full-width alphabet / Katakana")
+ (evil-test-buffer
+ "[A]BCカタカナ"
+ ("e")
+ "AB[C]カタカナ"))
+ (ert-info ("full-width alphabet / half-width Katakana")
+ (evil-test-buffer
+ "[A]BCカタカナ"
+ ("e")
+ "ABCカタカ[ナ]"))
+ (ert-info ("full-width alphabet / full-width numeric")
+ (evil-test-buffer
+ "[A]BC123"
+ ("e")
+ "ABC12[3]"))
+ (ert-info ("full-width alphabet / Hangul")
+ (evil-test-buffer
+ "[A]BC한글"
+ ("e")
+ "AB[C]한글"))
+ (ert-info ("full-width numeric / Latin")
+ (evil-test-buffer
+ "[1]23abcd"
+ ("e")
+ "123abc[d]"))
+ (ert-info ("full-width numeric / numeric")
+ (evil-test-buffer
+ "[1]231234"
+ ("e")
+ "123123[4]"))
+ (ert-info ("full-width numeric / Kanji")
+ (evil-test-buffer
+ "[1]23漢字"
+ ("e")
+ "12[3]漢字"))
+ (ert-info ("full-width numeric / Hiragana")
+ (evil-test-buffer
+ "[1]23ひらがな"
+ ("e")
+ "12[3]ひらがな"))
+ (ert-info ("full-width numeric / Katakana")
+ (evil-test-buffer
+ "[1]23カタカナ"
+ ("e")
+ "12[3]カタカナ"))
+ (ert-info ("full-width numeric / half-width Katakana")
+ (evil-test-buffer
+ "[1]23カタカナ"
+ ("e")
+ "123カタカ[ナ]"))
+ (ert-info ("full-width numeric / full-width alphabet")
+ (evil-test-buffer
+ "[1]23ABC"
+ ("e")
+ "123AB[C]"))
+ (ert-info ("full-width numeric / Hangul")
+ (evil-test-buffer
+ "[1]23한글"
+ ("e")
+ "12[3]한글"))
+ (ert-info ("Hangul / Latin")
+ (evil-test-buffer
+ "[한]글abcd"
+ ("e")
+ "한[글]abcd"))
+ (ert-info ("Hangul / numeric")
+ (evil-test-buffer
+ "[한]글1234"
+ ("e")
+ "한[글]1234"))
+ (ert-info ("Hangul / Kanji")
+ (evil-test-buffer
+ "[한]글漢字"
+ ("e")
+ "한[글]漢字"))
+ (ert-info ("Hangul / Hiragana")
+ (evil-test-buffer
+ "[한]글ひらがな"
+ ("e")
+ "한[글]ひらがな"))
+ (ert-info ("Hangul / Katakana")
+ (evil-test-buffer
+ "[한]글カタカナ"
+ ("e")
+ "한[글]カタカナ"))
+ (ert-info ("Hangul / half-width Katakana")
+ (evil-test-buffer
+ "[한]글カタカナ"
+ ("e")
+ "한[글]カタカナ"))
+ (ert-info ("Hangul / full-width alphabet")
+ (evil-test-buffer
+ "[한]글ABC"
+ ("e")
+ "한[글]ABC"))
+ (ert-info ("Hangul / full-width numeric")
+ (evil-test-buffer
+ "[한]글123"
+ ("e")
+ "한[글]123")))
+
+(ert-deftest evil-test-backword-word-begin-cjk ()
+ "Test `evil-backward-word-begin' on CJK words"
+ :tags '(evil motion cjk)
+ (ert-info ("Latin / numeric")
+ (evil-test-buffer
+ "abcd123[4]"
+ ("b")
+ "[a]bcd1234"))
+ (ert-info ("Latin / Kanji")
+ (evil-test-buffer
+ "abcd漢[字]"
+ ("b")
+ "abcd[漢]字"))
+ (ert-info ("Latin / Hiragana")
+ (evil-test-buffer
+ "abcdひらが[な]"
+ ("b")
+ "abcd[ひ]らがな"))
+ (ert-info ("Latin / Katakana")
+ (evil-test-buffer
+ "abcdカタカ[ナ]"
+ ("b")
+ "abcd[カ]タカナ"))
+ (ert-info ("Latin / half-width Katakana")
+ (evil-test-buffer
+ "abcdカタカ[ナ]"
+ ("b")
+ "[a]bcdカタカナ"))
+ (ert-info ("Latin / full-width alphabet")
+ (evil-test-buffer
+ "abcdAB[C]"
+ ("b")
+ "[a]bcdABC"))
+ (ert-info ("Latin / full-width numeric")
+ (evil-test-buffer
+ "abcd12[3]"
+ ("b")
+ "[a]bcd123"))
+ (ert-info ("Latin / Hangul")
+ (evil-test-buffer
+ "abcd한[글]"
+ ("b")
+ "abcd[한]글"))
+ (ert-info ("numeric / Latin")
+ (evil-test-buffer
+ "1234abc[d]"
+ ("b")
+ "[1]234abcd"))
+ (ert-info ("numeric / Kanji")
+ (evil-test-buffer
+ "1234漢[字]"
+ ("b")
+ "1234[漢]字"))
+ (ert-info ("numeric / Hiragana")
+ (evil-test-buffer
+ "1234ひらが[な]"
+ ("b")
+ "1234[ひ]らがな"))
+ (ert-info ("numeric / Katakana")
+ (evil-test-buffer
+ "1234カタカ[ナ]"
+ ("b")
+ "1234[カ]タカナ"))
+ (ert-info ("numeric / half-width Katakana")
+ (evil-test-buffer
+ "1234カタカ[ナ]"
+ ("b")
+ "[1]234カタカナ"))
+ (ert-info ("numeric / full-width alphabet")
+ (evil-test-buffer
+ "1234AB[C]"
+ ("b")
+ "[1]234ABC"))
+ (ert-info ("numeric / full-width numeric")
+ (evil-test-buffer
+ "123412[3]"
+ ("b")
+ "[1]234123"))
+ (ert-info ("numeric / Hangul")
+ (evil-test-buffer
+ "1234한[글]"
+ ("b")
+ "1234[한]글"))
+ (ert-info ("Kanji / Latin")
+ (evil-test-buffer
+ "漢字abc[d]"
+ ("b")
+ "漢字[a]bcd"))
+ (ert-info ("Kanji / numeric")
+ (evil-test-buffer
+ "漢字123[4]"
+ ("b")
+ "漢字[1]234"))
+ (ert-info ("Kanji / Hiragana")
+ (evil-test-buffer
+ "漢字ひらが[な]"
+ ("b")
+ "漢字[ひ]らがな"))
+ (ert-info ("Kanji / Katakana")
+ (evil-test-buffer
+ "漢字カタカ[ナ]"
+ ("b")
+ "漢字[カ]タカナ"))
+ (ert-info ("Kanji / half-width Katakana")
+ (evil-test-buffer
+ "漢字カタカ[ナ]"
+ ("b")
+ "漢字[カ]タカナ"))
+ (ert-info ("Kanji / full-width alphabet")
+ (evil-test-buffer
+ "漢字AB[C]"
+ ("b")
+ "漢字[A]BC"))
+ (ert-info ("Kanji / full-width numeric")
+ (evil-test-buffer
+ "漢字12[3]"
+ ("b")
+ "漢字[1]23"))
+ (ert-info ("Kanji / Hangul")
+ (evil-test-buffer
+ "漢字한[글]"
+ ("b")
+ "漢字[한]글"))
+ (ert-info ("Hiragana / Latin")
+ (evil-test-buffer
+ "ひらがなabc[d]"
+ ("b")
+ "ひらがな[a]bcd"))
+ (ert-info ("Hiragana / numeric")
+ (evil-test-buffer
+ "ひらがな123[4]"
+ ("b")
+ "ひらがな[1]234"))
+ (ert-info ("Hiragana / Kanji")
+ (evil-test-buffer
+ "ひらがな漢[字]"
+ ("b")
+ "ひらがな[漢]字"))
+ (ert-info ("Hiragana / Katakana")
+ (evil-test-buffer
+ "ひらがなカタカ[ナ]"
+ ("b")
+ "ひらがな[カ]タカナ"))
+ (ert-info ("Hiragana / half-width Katakana")
+ (evil-test-buffer
+ "ひらがなカタカ[ナ]"
+ ("b")
+ "ひらがな[カ]タカナ"))
+ (ert-info ("Hiragana / full-width alphabet")
+ (evil-test-buffer
+ "ひらがなAB[C]"
+ ("b")
+ "ひらがな[A]BC"))
+ (ert-info ("Hiragana / full-width numeric")
+ (evil-test-buffer
+ "ひらがな12[3]"
+ ("b")
+ "ひらがな[1]23"))
+ (ert-info ("Hiragana / Hangul")
+ (evil-test-buffer
+ "ひらがな한[글]"
+ ("b")
+ "ひらがな[한]글"))
+ (ert-info ("Katakana / Latin")
+ (evil-test-buffer
+ "カタカナabc[d]"
+ ("b")
+ "カタカナ[a]bcd"))
+ (ert-info ("Katakana / numeric")
+ (evil-test-buffer
+ "カタカナ123[4]"
+ ("b")
+ "カタカナ[1]234"))
+ (ert-info ("Katakana / Kanji")
+ (evil-test-buffer
+ "カタカナ漢[字]"
+ ("b")
+ "カタカナ[漢]字"))
+ (ert-info ("Katakana / Hiragana")
+ (evil-test-buffer
+ "カタカナひらが[な]"
+ ("b")
+ "カタカナ[ひ]らがな"))
+ (ert-info ("Katakana / half-width Katakana")
+ (evil-test-buffer
+ "カタカナカタカ[ナ]"
+ ("b")
+ "カタカナ[カ]タカナ"))
+ (ert-info ("Katakana / full-width alphabet")
+ (evil-test-buffer
+ "カタカナAB[C]"
+ ("b")
+ "カタカナ[A]BC"))
+ (ert-info ("Katakana / full-width numeric")
+ (evil-test-buffer
+ "カタカナ12[3]"
+ ("b")
+ "カタカナ[1]23"))
+ (ert-info ("Katakana / Hangul")
+ (evil-test-buffer
+ "カタカナ한[글]"
+ ("b")
+ "カタカナ[한]글"))
+ (ert-info ("half-width Katakana / Latin")
+ (evil-test-buffer
+ "カタカナabc[d]"
+ ("b")
+ "[カ]タカナabcd"))
+ (ert-info ("half-width Katakana / numeric")
+ (evil-test-buffer
+ "カタカナ123[4]"
+ ("b")
+ "[カ]タカナ1234"))
+ (ert-info ("half-width Katakana / Kanji")
+ (evil-test-buffer
+ "カタカナ漢[字]"
+ ("b")
+ "カタカナ[漢]字"))
+ (ert-info ("half-width Katakana / Hiragana")
+ (evil-test-buffer
+ "カタカナひらが[な]"
+ ("b")
+ "カタカナ[ひ]らがな"))
+ (ert-info ("half-width Katakana / Katakana")
+ (evil-test-buffer
+ "カタカナカタカ[ナ]"
+ ("b")
+ "カタカナ[カ]タカナ"))
+ (ert-info ("half-width Katakana / full-width alphabet")
+ (evil-test-buffer
+ "カタカナAB[C]"
+ ("b")
+ "[カ]タカナABC"))
+ (ert-info ("half-width Katakana / full-width numeric")
+ (evil-test-buffer
+ "カタカナ12[3]"
+ ("b")
+ "[カ]タカナ123"))
+ (ert-info ("half-width Katakana / Hangul")
+ (evil-test-buffer
+ "カタカナ한[글]"
+ ("b")
+ "カタカナ[한]글"))
+ (ert-info ("full-width alphabet / Latin")
+ (evil-test-buffer
+ "ABCabc[d]"
+ ("b")
+ "[A]BCabcd"))
+ (ert-info ("full-width alphabet / numeric")
+ (evil-test-buffer
+ "ABC123[4]"
+ ("b")
+ "[A]BC1234"))
+ (ert-info ("full-width alphabet / Kanji")
+ (evil-test-buffer
+ "ABC漢[字]"
+ ("b")
+ "ABC[漢]字"))
+ (ert-info ("full-width alphabet / Hiragana")
+ (evil-test-buffer
+ "ABCひらが[な]"
+ ("b")
+ "ABC[ひ]らがな"))
+ (ert-info ("full-width alphabet / Katakana")
+ (evil-test-buffer
+ "ABCカタカ[ナ]"
+ ("b")
+ "ABC[カ]タカナ"))
+ (ert-info ("full-width alphabet / half-width Katakana")
+ (evil-test-buffer
+ "ABCカタカ[ナ]"
+ ("b")
+ "[A]BCカタカナ"))
+ (ert-info ("full-width alphabet / full-width numeric")
+ (evil-test-buffer
+ "ABC12[3]"
+ ("b")
+ "[A]BC123"))
+ (ert-info ("full-width alphabet / Hangul")
+ (evil-test-buffer
+ "ABC한[글]"
+ ("b")
+ "ABC[한]글"))
+ (ert-info ("full-width numeric / Latin")
+ (evil-test-buffer
+ "123abc[d]"
+ ("b")
+ "[1]23abcd"))
+ (ert-info ("full-width numeric / numeric")
+ (evil-test-buffer
+ "123123[4]"
+ ("b")
+ "[1]231234"))
+ (ert-info ("full-width numeric / Kanji")
+ (evil-test-buffer
+ "123漢[字]"
+ ("b")
+ "123[漢]字"))
+ (ert-info ("full-width numeric / Hiragana")
+ (evil-test-buffer
+ "123ひらが[な]"
+ ("b")
+ "123[ひ]らがな"))
+ (ert-info ("full-width numeric / Katakana")
+ (evil-test-buffer
+ "123カタカ[ナ]"
+ ("b")
+ "123[カ]タカナ"))
+ (ert-info ("full-width numeric / half-width Katakana")
+ (evil-test-buffer
+ "123カタカ[ナ]"
+ ("b")
+ "[1]23カタカナ"))
+ (ert-info ("full-width numeric / full-width alphabet")
+ (evil-test-buffer
+ "123AB[C]"
+ ("b")
+ "[1]23ABC"))
+ (ert-info ("full-width numeric / Hangul")
+ (evil-test-buffer
+ "123한[글]"
+ ("b")
+ "123[한]글"))
+ (ert-info ("Hangul / Latin")
+ (evil-test-buffer
+ "한글abc[d]"
+ ("b")
+ "한글[a]bcd"))
+ (ert-info ("Hangul / numeric")
+ (evil-test-buffer
+ "한글123[4]"
+ ("b")
+ "한글[1]234"))
+ (ert-info ("Hangul / Kanji")
+ (evil-test-buffer
+ "한글漢[字]"
+ ("b")
+ "한글[漢]字"))
+ (ert-info ("Hangul / Hiragana")
+ (evil-test-buffer
+ "한글ひらが[な]"
+ ("b")
+ "한글[ひ]らがな"))
+ (ert-info ("Hangul / Katakana")
+ (evil-test-buffer
+ "한글カタカ[ナ]"
+ ("b")
+ "한글[カ]タカナ"))
+ (ert-info ("Hangul / half-width Katakana")
+ (evil-test-buffer
+ "한글カタカ[ナ]"
+ ("b")
+ "한글[カ]タカナ"))
+ (ert-info ("Hangul / full-width alphabet")
+ (evil-test-buffer
+ "한글AB[C]"
+ ("b")
+ "한글[A]BC"))
+ (ert-info ("Hangul / full-width numeric")
+ (evil-test-buffer
+ "한글12[3]"
+ ("b")
+ "한글[1]23")))
+
+(ert-deftest evil-test-backword-word-end-cjk ()
+ "Test `evil-backward-word-end' on CJK words"
+ :tags '(evil motion cjk)
+ (ert-info ("Latin / numeric")
+ (evil-test-buffer
+ "abcd123[4]"
+ ("ge")
+ "[a]bcd1234"))
+ (ert-info ("Latin / Kanji")
+ (evil-test-buffer
+ "abcd漢[字]"
+ ("ge")
+ "abc[d]漢字"))
+ (ert-info ("Latin / Hiragana")
+ (evil-test-buffer
+ "abcdひらが[な]"
+ ("ge")
+ "abc[d]ひらがな"))
+ (ert-info ("Latin / Katakana")
+ (evil-test-buffer
+ "abcdカタカ[ナ]"
+ ("ge")
+ "abc[d]カタカナ"))
+ (ert-info ("Latin / half-width Katakana")
+ (evil-test-buffer
+ "abcdカタカ[ナ]"
+ ("ge")
+ "[a]bcdカタカナ"))
+ (ert-info ("Latin / full-width alphabet")
+ (evil-test-buffer
+ "abcdAB[C]"
+ ("ge")
+ "[a]bcdABC"))
+ (ert-info ("Latin / full-width numeric")
+ (evil-test-buffer
+ "abcd12[3]"
+ ("ge")
+ "[a]bcd123"))
+ (ert-info ("Latin / Hangul")
+ (evil-test-buffer
+ "abcd한[글]"
+ ("ge")
+ "abc[d]한글"))
+ (ert-info ("numeric / Latin")
+ (evil-test-buffer
+ "1234abc[d]"
+ ("ge")
+ "[1]234abcd"))
+ (ert-info ("numeric / Kanji")
+ (evil-test-buffer
+ "1234漢[字]"
+ ("ge")
+ "123[4]漢字"))
+ (ert-info ("numeric / Hiragana")
+ (evil-test-buffer
+ "1234ひらが[な]"
+ ("ge")
+ "123[4]ひらがな"))
+ (ert-info ("numeric / Katakana")
+ (evil-test-buffer
+ "1234カタカ[ナ]"
+ ("ge")
+ "123[4]カタカナ"))
+ (ert-info ("numeric / half-width Katakana")
+ (evil-test-buffer
+ "1234カタカ[ナ]"
+ ("ge")
+ "[1]234カタカナ"))
+ (ert-info ("numeric / full-width alphabet")
+ (evil-test-buffer
+ "1234AB[C]"
+ ("ge")
+ "[1]234ABC"))
+ (ert-info ("numeric / full-width numeric")
+ (evil-test-buffer
+ "123412[3]"
+ ("ge")
+ "[1]234123"))
+ (ert-info ("numeric / Hangul")
+ (evil-test-buffer
+ "1234한[글]"
+ ("ge")
+ "123[4]한글"))
+ (ert-info ("Kanji / Latin")
+ (evil-test-buffer
+ "漢字abc[d]"
+ ("ge")
+ "漢[字]abcd"))
+ (ert-info ("Kanji / numeric")
+ (evil-test-buffer
+ "漢字123[4]"
+ ("ge")
+ "漢[字]1234"))
+ (ert-info ("Kanji / Hiragana")
+ (evil-test-buffer
+ "漢字ひらが[な]"
+ ("ge")
+ "漢[字]ひらがな"))
+ (ert-info ("Kanji / Katakana")
+ (evil-test-buffer
+ "漢字カタカ[ナ]"
+ ("ge")
+ "漢[字]カタカナ"))
+ (ert-info ("Kanji / half-width Katakana")
+ (evil-test-buffer
+ "漢字カタカ[ナ]"
+ ("ge")
+ "漢[字]カタカナ"))
+ (ert-info ("Kanji / full-width alphabet")
+ (evil-test-buffer
+ "漢字AB[C]"
+ ("ge")
+ "漢[字]ABC"))
+ (ert-info ("Kanji / full-width numeric")
+ (evil-test-buffer
+ "漢字12[3]"
+ ("ge")
+ "漢[字]123"))
+ (ert-info ("Kanji / Hangul")
+ (evil-test-buffer
+ "漢字한[글]"
+ ("ge")
+ "漢[字]한글"))
+ (ert-info ("Hiragana / Latin")
+ (evil-test-buffer
+ "ひらがなabc[d]"
+ ("ge")
+ "ひらが[な]abcd"))
+ (ert-info ("Hiragana / numeric")
+ (evil-test-buffer
+ "ひらがな123[4]"
+ ("ge")
+ "ひらが[な]1234"))
+ (ert-info ("Hiragana / Kanji")
+ (evil-test-buffer
+ "ひらがな漢[字]"
+ ("ge")
+ "ひらが[な]漢字"))
+ (ert-info ("Hiragana / Katakana")
+ (evil-test-buffer
+ "ひらがなカタカ[ナ]"
+ ("ge")
+ "ひらが[な]カタカナ"))
+ (ert-info ("Hiragana / half-width Katakana")
+ (evil-test-buffer
+ "ひらがなカタカ[ナ]"
+ ("ge")
+ "ひらが[な]カタカナ"))
+ (ert-info ("Hiragana / full-width alphabet")
+ (evil-test-buffer
+ "ひらがなAB[C]"
+ ("ge")
+ "ひらが[な]ABC"))
+ (ert-info ("Hiragana / full-width numeric")
+ (evil-test-buffer
+ "ひらがな12[3]"
+ ("ge")
+ "ひらが[な]123"))
+ (ert-info ("Hiragana / Hangul")
+ (evil-test-buffer
+ "ひらがな한[글]"
+ ("ge")
+ "ひらが[な]한글"))
+ (ert-info ("Katakana / Latin")
+ (evil-test-buffer
+ "カタカナabc[d]"
+ ("ge")
+ "カタカ[ナ]abcd"))
+ (ert-info ("Katakana / numeric")
+ (evil-test-buffer
+ "カタカナ123[4]"
+ ("ge")
+ "カタカ[ナ]1234"))
+ (ert-info ("Katakana / Kanji")
+ (evil-test-buffer
+ "カタカナ漢[字]"
+ ("ge")
+ "カタカ[ナ]漢字"))
+ (ert-info ("Katakana / Hiragana")
+ (evil-test-buffer
+ "カタカナひらが[な]"
+ ("ge")
+ "カタカ[ナ]ひらがな"))
+ (ert-info ("Katakana / half-width Katakana")
+ (evil-test-buffer
+ "カタカナカタカ[ナ]"
+ ("ge")
+ "カタカ[ナ]カタカナ"))
+ (ert-info ("Katakana / full-width alphabet")
+ (evil-test-buffer
+ "カタカナAB[C]"
+ ("ge")
+ "カタカ[ナ]ABC"))
+ (ert-info ("Katakana / full-width numeric")
+ (evil-test-buffer
+ "カタカナ12[3]"
+ ("ge")
+ "カタカ[ナ]123"))
+ (ert-info ("Katakana / Hangul")
+ (evil-test-buffer
+ "カタカナ한[글]"
+ ("ge")
+ "カタカ[ナ]한글"))
+ (ert-info ("half-width Katakana / Latin")
+ (evil-test-buffer
+ "カタカナabc[d]"
+ ("ge")
+ "[カ]タカナabcd"))
+ (ert-info ("half-width Katakana / numeric")
+ (evil-test-buffer
+ "カタカナ123[4]"
+ ("ge")
+ "[カ]タカナ1234"))
+ (ert-info ("half-width Katakana / Kanji")
+ (evil-test-buffer
+ "カタカナ漢[字]"
+ ("ge")
+ "カタカ[ナ]漢字"))
+ (ert-info ("half-width Katakana / Hiragana")
+ (evil-test-buffer
+ "カタカナひらが[な]"
+ ("ge")
+ "カタカ[ナ]ひらがな"))
+ (ert-info ("half-width Katakana / Katakana")
+ (evil-test-buffer
+ "カタカナカタカ[ナ]"
+ ("ge")
+ "カタカ[ナ]カタカナ"))
+ (ert-info ("half-width Katakana / full-width alphabet")
+ (evil-test-buffer
+ "カタカナAB[C]"
+ ("ge")
+ "[カ]タカナABC"))
+ (ert-info ("half-width Katakana / full-width numeric")
+ (evil-test-buffer
+ "カタカナ12[3]"
+ ("ge")
+ "[カ]タカナ123"))
+ (ert-info ("half-width Katakana / Hangul")
+ (evil-test-buffer
+ "カタカナ한[글]"
+ ("ge")
+ "カタカ[ナ]한글"))
+ (ert-info ("full-width alphabet / Latin")
+ (evil-test-buffer
+ "ABCabc[d]"
+ ("ge")
+ "[A]BCabcd"))
+ (ert-info ("full-width alphabet / numeric")
+ (evil-test-buffer
+ "ABC123[4]"
+ ("ge")
+ "[A]BC1234"))
+ (ert-info ("full-width alphabet / Kanji")
+ (evil-test-buffer
+ "ABC漢[字]"
+ ("ge")
+ "AB[C]漢字"))
+ (ert-info ("full-width alphabet / Hiragana")
+ (evil-test-buffer
+ "ABCひらが[な]"
+ ("ge")
+ "AB[C]ひらがな"))
+ (ert-info ("full-width alphabet / Katakana")
+ (evil-test-buffer
+ "ABCカタカ[ナ]"
+ ("ge")
+ "AB[C]カタカナ"))
+ (ert-info ("full-width alphabet / half-width Katakana")
+ (evil-test-buffer
+ "ABCカタカ[ナ]"
+ ("ge")
+ "[A]BCカタカナ"))
+ (ert-info ("full-width alphabet / full-width numeric")
+ (evil-test-buffer
+ "ABC12[3]"
+ ("ge")
+ "[A]BC123"))
+ (ert-info ("full-width alphabet / Hangul")
+ (evil-test-buffer
+ "ABC한[글]"
+ ("ge")
+ "AB[C]한글"))
+ (ert-info ("full-width numeric / Latin")
+ (evil-test-buffer
+ "123abc[d]"
+ ("ge")
+ "[1]23abcd"))
+ (ert-info ("full-width numeric / numeric")
+ (evil-test-buffer
+ "123123[4]"
+ ("ge")
+ "[1]231234"))
+ (ert-info ("full-width numeric / Kanji")
+ (evil-test-buffer
+ "123漢[字]"
+ ("ge")
+ "12[3]漢字"))
+ (ert-info ("full-width numeric / Hiragana")
+ (evil-test-buffer
+ "123ひらが[な]"
+ ("ge")
+ "12[3]ひらがな"))
+ (ert-info ("full-width numeric / Katakana")
+ (evil-test-buffer
+ "123カタカ[ナ]"
+ ("ge")
+ "12[3]カタカナ"))
+ (ert-info ("full-width numeric / half-width Katakana")
+ (evil-test-buffer
+ "123カタカ[ナ]"
+ ("ge")
+ "[1]23カタカナ"))
+ (ert-info ("full-width numeric / full-width alphabet")
+ (evil-test-buffer
+ "123AB[C]"
+ ("ge")
+ "[1]23ABC"))
+ (ert-info ("full-width numeric / Hangul")
+ (evil-test-buffer
+ "123한[글]"
+ ("ge")
+ "12[3]한글"))
+ (ert-info ("Hangul / Latin")
+ (evil-test-buffer
+ "한글abc[d]"
+ ("ge")
+ "한[글]abcd"))
+ (ert-info ("Hangul / numeric")
+ (evil-test-buffer
+ "한글123[4]"
+ ("ge")
+ "한[글]1234"))
+ (ert-info ("Hangul / Kanji")
+ (evil-test-buffer
+ "한글漢[字]"
+ ("ge")
+ "한[글]漢字"))
+ (ert-info ("Hangul / Hiragana")
+ (evil-test-buffer
+ "한글ひらが[な]"
+ ("ge")
+ "한[글]ひらがな"))
+ (ert-info ("Hangul / Katakana")
+ (evil-test-buffer
+ "한글カタカ[ナ]"
+ ("ge")
+ "한[글]カタカナ"))
+ (ert-info ("Hangul / half-width Katakana")
+ (evil-test-buffer
+ "한글カタカ[ナ]"
+ ("ge")
+ "한[글]カタカナ"))
+ (ert-info ("Hangul / full-width alphabet")
+ (evil-test-buffer
+ "한글AB[C]"
+ ("ge")
+ "한[글]ABC"))
+ (ert-info ("Hangul / full-width numeric")
+ (evil-test-buffer
+ "한글12[3]"
+ ("ge")
+ "한[글]123")))
+
+(ert-deftest evil-test-forward-paragraph ()
+ "Test `evil-forward-paragraph'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "[A]bove some line
+
+Below some empty line"
+ ("}")
+ "Above some line
+\[]
+Below some empty line"))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "[A]bove some line
+
+Below some empty line"
+ ("2}")
+ "Above some line
+
+Below some empty lin[e]"))
+ (ert-info ("End of buffer")
+ (evil-test-buffer
+ "[B]elow some empty line"
+ ("100}")
+ "Below some empty lin[e]"
+ (should-error (execute-kbd-macro "}"))
+ (should-error (execute-kbd-macro "42}"))))
+ (ert-info ("End of buffer with newline")
+ (evil-test-buffer
+ "[B]elow some empty line\n\n"
+ ("100}")
+ "Below some empty line\n\n[]"
+ (should-error (execute-kbd-macro "}"))
+ (should-error (execute-kbd-macro "42}")))))
+
+(ert-deftest evil-test-backward-paragraph ()
+ "Test `evil-backward-paragraph'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "Above some line
+
+Below some empty lin[e]"
+ ("{")
+ "Above some line
+\[]
+Below some empty line"))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "Above some line
+
+Below some empty lin[e]"
+ ("2{")
+ "[A]bove some line
+
+Below some empty line"))
+ (ert-info ("Beginning of buffer")
+ (evil-test-buffer
+ "Above some line
+
+Below some empty lin[e]"
+ ("100{")
+ "[A]bove some line
+
+Below some empty line"
+ (should-error (execute-kbd-macro "{"))
+ (should-error (execute-kbd-macro "42{"))))
+ (ert-info ("Beginning of buffer with newlines")
+ (evil-test-buffer
+ "\n\nAbove some line
+
+Below some empty lin[e]"
+ ("100{")
+ "[]\n\nAbove some line
+
+Below some empty line"
+ (should-error (execute-kbd-macro "{"))
+ (should-error (execute-kbd-macro "42{")))))
+
+(ert-deftest evil-test-forward-sentence ()
+ "Test `evil-forward-sentence'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line."
+ (")")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. [I]f you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line."
+ (")")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+\[]
+Below some empty line."
+ (")")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+\[B]elow some empty line."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line."
+ ("2)")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+\[]
+Below some empty line."
+ ("2)")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line[.]"))
+ (ert-info ("End of buffer")
+ (evil-test-buffer
+ "[B]elow some empty line."
+ ("100)")
+ "Below some empty line[.]"
+ (should-error (execute-kbd-macro ")"))
+ (should-error (execute-kbd-macro "42)"))))
+ (ert-info ("End of buffer with newline")
+ (evil-test-buffer
+ "[B]elow some empty line.\n\n"
+ (")")
+ "Below some empty line.\n[\n]"
+ (")")
+ "Below some empty line.\n\n[]"
+ (should-error (execute-kbd-macro ")"))
+ (should-error (execute-kbd-macro "42)")))))
+
+(ert-deftest evil-test-backward-sentence ()
+ "Test `evil-backward-sentence'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line[.]"
+ ("(")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+\[B]elow some empty line."
+ ("(")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+\[]
+Below some empty line."
+ ("(")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. [I]f you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line."
+ ("(")
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line[.]"
+ ("2(")
+ ";; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+\[]
+Below some empty line."
+ ("2(")
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation. If you want to create a file,
+;; visit that file with C-x C-f.
+
+Below some empty line."))
+ (ert-info ("Beginning of buffer")
+ (evil-test-buffer
+ ";; This buffer is for notes you don't want to save[.]"
+ ("100(")
+ "[;]; This buffer is for notes you don't want to save."
+ (should-error (execute-kbd-macro "("))
+ (should-error (execute-kbd-macro "42("))))
+ (ert-info ("Beginning of buffer with newlines")
+ (evil-test-buffer
+ "\n\n;; This buffer is for notes you don't want to save[.]"
+ ("100(")
+ "[]\n\n;; This buffer is for notes you don't want to save."
+ (should-error (execute-kbd-macro "("))
+ (should-error (execute-kbd-macro "42(")))))
+
+(ert-deftest evil-test-find-char ()
+ "Test `evil-find-char'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("fT")
+ ";; [T]his buffer is for notes."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("2fe")
+ ";; This buffer is for not[e]s."))
+ (ert-info ("Repeat")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("fe;")
+ ";; This buffer is for not[e]s."))
+ (ert-info ("Repeat backward")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("2fe,")
+ ";; This buff[e]r is for notes."))
+ (ert-info ("No match")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ (should-error (execute-kbd-macro "fL"))))
+ (ert-info ("End of line")
+ (let ((evil-cross-lines t))
+ (evil-test-buffer
+ "[;]; This buffer is for notes,
+;; and for Lisp evaluation."
+ ("fL")
+ ";; This buffer is for notes,
+;; and for [L]isp evaluation.")))
+ (ert-info ("Empty line")
+ (evil-test-buffer
+ "[]
+This buffer is for notes."
+ (should-error (execute-kbd-macro "fT")))))
+
+(ert-deftest evil-test-find-char-backward ()
+ "Test `evil-find-char-backward'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("FT")
+ ";; [T]his buffer is for notes."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("2Fe")
+ ";; This buff[e]r is for notes."))
+ (ert-info ("Repeat")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("Fe;")
+ ";; This buff[e]r is for notes."))
+ (ert-info ("Repeat backward")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("2Fe,")
+ ";; This buffer is for not[e]s."))
+ (ert-info ("No match")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ (should-error (execute-kbd-macro "FL"))))
+ (ert-info ("End of line")
+ (let ((evil-cross-lines t))
+ (evil-test-buffer
+ ";; This buffer is for notes,
+;; and for Lisp evaluation[.]"
+ ("FT")
+ ";; [T]his buffer is for notes,
+;; and for Lisp evaluation."))))
+
+(ert-deftest evil-test-find-digraph-char ()
+ "Test evil-read-digraph-char while finding char."
+ :tags '(evil motion)
+ (ert-info ("Find digraph char")
+ (evil-test-buffer
+ "a[b]cde∀g"
+ ("f\C-kFA")
+ "abcde[∀]g")))
+
+(ert-deftest evil-test-find-char-to ()
+ "Test `evil-find-char-to'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("tT")
+ ";;[ ]This buffer is for notes."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("2te")
+ ";; This buffer is for no[t]es."))
+ (ert-info ("Repeat")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("tel;")
+ ";; This buffer is for no[t]es."))
+ (ert-info ("Repeat backward")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ ("2te,")
+ ";; This buffe[r] is for notes."))
+ (ert-info ("Repeat should skip adjacent character")
+ (let ((evil-repeat-find-to-skip-next t))
+ (evil-test-buffer
+ "[a]aaxaaaxaaaxaaa"
+ ("tx;")
+ "aaaxaa[a]xaaaxaaa"
+ (";")
+ "aaaxaaaxaa[a]xaaa"
+ (",")
+ "aaaxaaax[a]aaxaaa"
+ (",")
+ "aaax[a]aaxaaaxaaa")))
+ (ert-info ("Repeat should NOT skip adjacent character")
+ (let ((evil-repeat-find-to-skip-next nil))
+ (evil-test-buffer
+ "[a]aaxaaaxaaaxaaa"
+ ("tx;")
+ "aa[a]xaaaxaaaxaaa")))
+ (ert-info ("No match")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ (should-error (execute-kbd-macro "tL"))))
+ (ert-info ("End of line")
+ (let ((evil-cross-lines t))
+ (evil-test-buffer
+ "[;]; This buffer is for notes,
+;; and for Lisp evaluation."
+ ("tL")
+ ";; This buffer is for notes,
+;; and for[ ]Lisp evaluation."))))
+
+(ert-deftest evil-test-find-char-to-backward ()
+ "Test `evil-find-char-to-backward'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("TT")
+ ";; T[h]is buffer is for notes."))
+ (ert-info ("With count")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("2Te")
+ ";; This buffe[r] is for notes."))
+ (ert-info ("Repeat")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("Teh;")
+ ";; This buffe[r] is for notes."))
+ (ert-info ("Repeat backward")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ ("2Te,")
+ ";; This buffer is for no[t]es."))
+ (ert-info ("Repeat should skip adjacent character")
+ (let ((evil-repeat-find-to-skip-next t))
+ (evil-test-buffer
+ "aaaxaaaxaaaxaa[a]"
+ ("Tx;")
+ "aaaxaaax[a]aaxaaa"
+ (";")
+ "aaax[a]aaxaaaxaaa"
+ (",")
+ "aaaxaa[a]xaaaxaaa"
+ (",")
+ "aaaxaaaxaa[a]xaaa")))
+ (ert-info ("Repeat should NOT skip adjacent character")
+ (let ((evil-repeat-find-to-skip-next nil))
+ (evil-test-buffer
+ "aaaxaaaxaaaxaa[a]"
+ ("Tx;")
+ "aaaxaaaxaaax[a]aa")))
+ (ert-info ("No match")
+ (evil-test-buffer
+ ";; This buffer is for notes[.]"
+ (should-error (execute-kbd-macro "TL"))))
+ (ert-info ("End of line")
+ (let ((evil-cross-lines t))
+ (evil-test-buffer
+ ";; This buffer is for notes,
+;; and for Lisp evaluation[.]"
+ ("TT")
+ ";; T[h]is buffer is for notes,
+;; and for Lisp evaluation."))))
+
+(ert-deftest evil-test-jump-item ()
+ "Test `evil-jump-item'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "int main[(]int argc, char** argv)"
+ ("%")
+ "int main(int argc, char** argv[)]"
+ ("%")
+ "int main[(]int argc, char** argv)"))
+ (ert-info ("Before parenthesis")
+ (evil-test-buffer
+ "[i]nt main(int argc, char** argv)"
+ ("%")
+ "int main(int argc, char** argv[)]"
+ ("5h")
+ "int main(int argc, char**[ ]argv)"
+ ("%")
+ "int main[(]int argc, char** argv)"))
+ (ert-info ("Over several lines")
+ (evil-test-buffer
+ "int main(int argc, char** argv)
+\[{]
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+}"
+ ("%")
+ "int main(int argc, char** argv)
+{
+ printf(\"Hello world\\n\");
+ return EXIT_SUCCESS;
+\[}]"))
+ (ert-info ("On line without parenthesis")
+ (evil-test-buffer
+ "[#]include <stdio.h>"
+ (should-error (execute-kbd-macro "%"))))
+ (ert-info ("Before unmatched opening parenthesies")
+ (evil-test-buffer
+ "x[x]xx ( yyyyy () zzzz"
+ (should-error (execute-kbd-macro "%"))
+ "x[x]xx ( yyyyy () zzzz"))
+ (ert-info ("Before unmatched closing parenthesies")
+ (evil-test-buffer
+ "x[x]xx ) yyyyy () zzzz"
+ (should-error (execute-kbd-macro "%"))
+ "x[x]xx ) yyyyy () zzzz"))
+
+ (ert-info ("At the end of the line")
+ (evil-test-buffer
+ "[p]ublic void foo(String bar) {\n blabla;\n}\n"
+ ("v$%")
+ "public void foo(String bar) {\n blabla;\n[}]\n")))
+
+(ert-deftest evil-test-unmatched-paren ()
+ "Test `evil-previous-open-paren' and `evil-next-close-paren'"
+ :tags '(evil motion)
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "foo ( { ( [b]ar ) baz } )"
+ ("[(")
+ "foo ( { [(] bar ) baz } )"
+ ("])")
+ "foo ( { ( bar [)] baz } )"
+ ("[(")
+ "foo ( { [(] bar ) baz } )"
+ ("[(")
+ "foo [(] { ( bar ) baz } )"
+ ("f)])")
+ "foo ( { ( bar ) baz } [)]"))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "foo ( { ( [b]ar ) baz } )"
+ ("2[(")
+ "foo [(] { ( bar ) baz } )")
+ (evil-test-buffer
+ "foo ( { ( [b]ar ) baz } )"
+ ("2])")
+ "foo ( { ( bar ) baz } [)]")))
+
+(ert-deftest evil-test-next-mark ()
+ "Test `evil-next-mark', `evil-previous-mark'"
+ :tags '(evil motion)
+ (ert-info ("Can move to next mark, next mark line,
+previous mark and previous mark line")
+ (evil-test-buffer
+ "[a]lpha bravo
+charlie delta echo
+foxtrot golf hotel
+india juliet"
+ ("ma" "w" "mb" "w"
+ "mc" "w" "md" "w" "me" "w"
+ "mf" "w" "mg" "w" "mh" "w"
+ "mi" "w" "mj")
+ "alpha bravo
+charlie delta echo
+foxtrot golf hotel
+india [j]uliet"
+ ("3]`")
+ "alpha bravo
+[c]harlie delta echo
+foxtrot golf hotel
+india juliet"
+ ("]'")
+ "alpha bravo
+charlie delta echo
+[f]oxtrot golf hotel
+india juliet"
+ ("[`")
+ "alpha bravo
+charlie delta [e]cho
+foxtrot golf hotel
+india juliet"
+ ("2['")
+ "alpha bravo
+charlie delta echo
+foxtrot golf hotel
+[i]ndia juliet")))
+
+(ert-deftest evil-set-col-0-mark-test ()
+ "Test `evil-set-col-0-mark' ex command"
+ :tags '(evil ex)
+ (evil-test-buffer
+ "Lin[e] 1
+Line 2"
+ (":mark k" [return] "G" "`k")
+ "[L]ine 1
+Line 2"))
+
+(ert-deftest evil-delete-marks-test ()
+ "Test `evil-delete-marks' ex command"
+ :tags '(evil ex)
+ (ert-info ("Can delete marks")
+ (evil-test-buffer
+ "[O]ne line is enough if we use backtick to navigate"
+ ("mO" "w" "ml" "w" "mi" "$b" "m4")
+ "One line is enough if we use backtick to [n]avigate"
+ ("`O")
+ "[O]ne line is enough if we use backtick to navigate"
+ (":delm O" [return] "`i")
+ "One line [i]s enough if we use backtick to navigate"
+ (error user-error "`O")
+ "One line [i]s enough if we use backtick to navigate"
+ ("`4")
+ "One line is enough if we use backtick to [n]avigate"
+ (":delm h-m" [return])
+ (error user-error "`i")
+ "One line is enough if we use backtick to [n]avigate")))
+
+(ert-deftest evil-test-flyspell-motions ()
+ "Test flyspell motions"
+ :tags '(evil motion)
+ (skip-unless (executable-find "aspell"))
+ (ert-info ("Simple")
+ (evil-test-buffer
+ "[I] cannt tpye for lyfe"
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("]s")
+ "I [c]annt tpye for lyfe"
+ ("]s")
+ "I cannt [t]pye for lyfe"
+ ("]s")
+ "I cannt tpye for [l]yfe"
+ ("]s")
+ "I [c]annt tpye for lyfe"
+ ("[s")
+ "I cannt tpye for [l]yfe"
+ ("[s")
+ "I cannt [t]pye for lyfe"))
+ (ert-info ("With count")
+ (evil-test-buffer
+ "[I] cannt tpye for lyfe"
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("2]s")
+ "I cannt [t]pye for lyfe"
+ ("2]s")
+ "I [c]annt tpye for lyfe"
+ ("2[s")
+ "I cannt [t]pye for lyfe"
+ ("2[s")
+ "I cannt tpye for [l]yfe"))
+ (ert-info ("With evil-search-wrap disabled")
+ (let (evil-search-wrap)
+ (evil-test-buffer
+ "[I] cannt tpye for lyfe"
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("]s")
+ "I [c]annt tpye for lyfe"
+ ("]s")
+ "I cannt [t]pye for lyfe"
+ ("]s")
+ "I cannt tpye for [l]yfe"
+ ("]s")
+ "I cannt tpye for [l]yfe")))
+ (ert-info ("One mistake")
+ (evil-test-buffer
+ "[I]'m almst there..."
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("]s")
+ "I'm [a]lmst there..."
+ ("]s")
+ "I'm [a]lmst there..."))
+ (ert-info ("No mistakes")
+ (evil-test-buffer
+ "[I]'ve learned to type!"
+ (flyspell-mode)
+ (flyspell-buffer)
+ ("]s")
+ "[I]'ve learned to type!"
+ ("[s")
+ "[I]'ve learned to type!")))
+
+;;; Text objects
+
+(ert-deftest evil-test-text-object ()
+ "Test `evil-define-text-object'"
+ :tags '(evil text-object)
+ (let ((object (evil-define-text-object nil (count &optional beg end type)
+ (let ((sel (and beg end (evil-range beg end))))
+ (when (and sel (> count 0)) (forward-char 1))
+ (let ((range (if (< count 0)
+ (list (- (point) 3) (point))
+ (list (point) (+ (point) 3)))))
+ (if sel
+ (evil-range-union range sel)
+ range))))))
+ (ert-info ("Select three characters after point")
+ (evil-test-buffer
+ :state operator
+ ";; [T]his buffer is for notes."
+ (should (equal (funcall object 1) '(4 7 inclusive)))))
+ (ert-info ("Select three characters before point")
+ (evil-test-buffer
+ :state operator
+ ";; [T]his buffer is for notes."
+ (should (equal (funcall object -1) '(1 4 inclusive)))))
+ (ert-info ("Select three characters after selection")
+ (evil-test-buffer
+ ";; <Thi[s]> buffer is for notes."
+ (call-interactively object)
+ ";; <This b[u]>ffer is for notes."))
+ (ert-info ("Select three characters before selection")
+ (evil-test-buffer
+ ";; <[T]his> buffer is for notes."
+ (call-interactively object)
+ "<[;]; This> buffer is for notes."))
+ (ert-info ("Delete three characters after point")
+ (evil-test-buffer
+ "[;]; This buffer is for notes."
+ (define-key evil-operator-state-local-map "io" object)
+ ("dio")
+ "[T]his buffer is for notes."))))
+
+(ert-deftest evil-test-word-objects ()
+ "Test `evil-inner-word' and `evil-a-word'"
+ :tags '(evil text-object)
+ (ert-info ("Select a word")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("viw")
+ ";; <Thi[s]> buffer is for notes.")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("vaw")
+ ";; <This[ ]>buffer is for notes.")
+ (evil-test-buffer
+ ";; Thi[s] buffer is for notes."
+ ("viw")
+ ";; <Thi[s]> buffer is for notes.")
+ (evil-test-buffer
+ ";; Thi[s] buffer is for notes."
+ ("vaw")
+ ";; <This[ ]>buffer is for notes."))
+ (ert-info ("Select two words")
+ (ert-info ("Include whitespace on this side")
+ (evil-test-buffer
+ ";;< Thi[s]> buffer is for notes."
+ ("aw")
+ ";;< This buffe[r]> is for notes.")
+ (evil-test-buffer
+ ";; This <[b]uffer >is for notes."
+ ("aw")
+ ";; <[T]his buffer >is for notes."))
+ (ert-info ("Include whitespace on the other side")
+ (evil-test-buffer
+ ";; <This[ ]>buffer is for notes."
+ ("aw")
+ ";; <This buffer[ ]>is for notes.")
+ (evil-test-buffer
+ ";; This<[ ]buffer> is for notes."
+ ("aw")
+ ";;<[ ]This buffer> is for notes.")))
+ (ert-info ("select first visual word")
+ (evil-test-buffer
+ "([a])"
+ ("viw")
+ "(<[a]>)"))
+ (ert-info ("Deleting whitespace is confined to the line")
+ (evil-test-buffer
+ "foo\n [ ] bar"
+ ("diw")
+ "foo\n[b]ar")
+ (evil-test-buffer
+ "foo\n [ ] bar"
+ ("diW")
+ "foo\n[b]ar")))
+
+(ert-deftest evil-test-word-objects-cjk ()
+ "Test `evil-inner-word' and `evil-a-word' on CJK words"
+ :tags '(evil text-object cjk)
+ (ert-info ("Select a word")
+ (evil-test-buffer
+ "[a]bcd1234"
+ ("viw")
+ "<abcd123[4]>")
+ (evil-test-buffer
+ "[a]bcd1234"
+ ("vaw")
+ "<abcd123[4]>")
+ (evil-test-buffer
+ "[a]bcd漢字"
+ ("viw")
+ "<abc[d]>漢字")
+ (evil-test-buffer
+ "[a]bcd漢字"
+ ("vaw")
+ "<abc[d]>漢字")
+ (evil-test-buffer
+ "[a]bcdひらがな"
+ ("viw")
+ "<abc[d]>ひらがな")
+ (evil-test-buffer
+ "[a]bcdひらがな"
+ ("vaw")
+ "<abc[d]>ひらがな")
+ (evil-test-buffer
+ "[a]bcdカタカナ"
+ ("viw")
+ "<abc[d]>カタカナ")
+ (evil-test-buffer
+ "[a]bcdカタカナ"
+ ("vaw")
+ "<abc[d]>カタカナ")
+ (evil-test-buffer
+ "[a]bcdカタカナ"
+ ("viw")
+ "<abcdカタカ[ナ]>")
+ (evil-test-buffer
+ "[a]bcdカタカナ"
+ ("vaw")
+ "<abcdカタカ[ナ]>")
+ (evil-test-buffer
+ "[a]bcdABC"
+ ("viw")
+ "<abcdAB[C]>")
+ (evil-test-buffer
+ "[a]bcdABC"
+ ("vaw")
+ "<abcdAB[C]>")
+ (evil-test-buffer
+ "[a]bcd123"
+ ("viw")
+ "<abcd12[3]>")
+ (evil-test-buffer
+ "[a]bcd123"
+ ("vaw")
+ "<abcd12[3]>")
+ (evil-test-buffer
+ "[a]bcd한글"
+ ("viw")
+ "<abc[d]>한글")
+ (evil-test-buffer
+ "[a]bcd한글"
+ ("vaw")
+ "<abc[d]>한글")
+ (evil-test-buffer
+ "[1]234abcd"
+ ("viw")
+ "<1234abc[d]>")
+ (evil-test-buffer
+ "[1]234abcd"
+ ("vaw")
+ "<1234abc[d]>")
+ (evil-test-buffer
+ "[1]234漢字"
+ ("viw")
+ "<123[4]>漢字")
+ (evil-test-buffer
+ "[1]234漢字"
+ ("vaw")
+ "<123[4]>漢字")
+ (evil-test-buffer
+ "[1]234ひらがな"
+ ("viw")
+ "<123[4]>ひらがな")
+ (evil-test-buffer
+ "[1]234ひらがな"
+ ("vaw")
+ "<123[4]>ひらがな")
+ (evil-test-buffer
+ "[1]234カタカナ"
+ ("viw")
+ "<123[4]>カタカナ")
+ (evil-test-buffer
+ "[1]234カタカナ"
+ ("vaw")
+ "<123[4]>カタカナ")
+ (evil-test-buffer
+ "[1]234カタカナ"
+ ("viw")
+ "<1234カタカ[ナ]>")
+ (evil-test-buffer
+ "[1]234カタカナ"
+ ("vaw")
+ "<1234カタカ[ナ]>")
+ (evil-test-buffer
+ "[1]234ABC"
+ ("viw")
+ "<1234AB[C]>")
+ (evil-test-buffer
+ "[1]234ABC"
+ ("vaw")
+ "<1234AB[C]>")
+ (evil-test-buffer
+ "[1]234123"
+ ("viw")
+ "<123412[3]>")
+ (evil-test-buffer
+ "[1]234123"
+ ("vaw")
+ "<123412[3]>")
+ (evil-test-buffer
+ "[1]234한글"
+ ("viw")
+ "<123[4]>한글")
+ (evil-test-buffer
+ "[1]234한글"
+ ("vaw")
+ "<123[4]>한글")
+ (evil-test-buffer
+ "[漢]字abcd"
+ ("viw")
+ "<漢[字]>abcd")
+ (evil-test-buffer
+ "[漢]字abcd"
+ ("vaw")
+ "<漢[字]>abcd")
+ (evil-test-buffer
+ "[漢]字1234"
+ ("viw")
+ "<漢[字]>1234")
+ (evil-test-buffer
+ "[漢]字1234"
+ ("vaw")
+ "<漢[字]>1234")
+ (evil-test-buffer
+ "[漢]字ひらがな"
+ ("viw")
+ "<漢[字]>ひらがな")
+ (evil-test-buffer
+ "[漢]字ひらがな"
+ ("vaw")
+ "<漢[字]>ひらがな")
+ (evil-test-buffer
+ "[漢]字カタカナ"
+ ("viw")
+ "<漢[字]>カタカナ")
+ (evil-test-buffer
+ "[漢]字カタカナ"
+ ("vaw")
+ "<漢[字]>カタカナ")
+ (evil-test-buffer
+ "[漢]字カタカナ"
+ ("viw")
+ "<漢[字]>カタカナ")
+ (evil-test-buffer
+ "[漢]字カタカナ"
+ ("vaw")
+ "<漢[字]>カタカナ")
+ (evil-test-buffer
+ "[漢]字ABC"
+ ("viw")
+ "<漢[字]>ABC")
+ (evil-test-buffer
+ "[漢]字ABC"
+ ("vaw")
+ "<漢[字]>ABC")
+ (evil-test-buffer
+ "[漢]字123"
+ ("viw")
+ "<漢[字]>123")
+ (evil-test-buffer
+ "[漢]字123"
+ ("vaw")
+ "<漢[字]>123")
+ (evil-test-buffer
+ "[漢]字한글"
+ ("viw")
+ "<漢[字]>한글")
+ (evil-test-buffer
+ "[漢]字한글"
+ ("vaw")
+ "<漢[字]>한글")
+ (evil-test-buffer
+ "[ひ]らがなabcd"
+ ("viw")
+ "<ひらが[な]>abcd")
+ (evil-test-buffer
+ "[ひ]らがなabcd"
+ ("vaw")
+ "<ひらが[な]>abcd")
+ (evil-test-buffer
+ "[ひ]らがな1234"
+ ("viw")
+ "<ひらが[な]>1234")
+ (evil-test-buffer
+ "[ひ]らがな1234"
+ ("vaw")
+ "<ひらが[な]>1234")
+ (evil-test-buffer
+ "[ひ]らがな漢字"
+ ("viw")
+ "<ひらが[な]>漢字")
+ (evil-test-buffer
+ "[ひ]らがな漢字"
+ ("vaw")
+ "<ひらが[な]>漢字")
+ (evil-test-buffer
+ "[ひ]らがなカタカナ"
+ ("viw")
+ "<ひらが[な]>カタカナ")
+ (evil-test-buffer
+ "[ひ]らがなカタカナ"
+ ("vaw")
+ "<ひらが[な]>カタカナ")
+ (evil-test-buffer
+ "[ひ]らがなカタカナ"
+ ("viw")
+ "<ひらが[な]>カタカナ")
+ (evil-test-buffer
+ "[ひ]らがなカタカナ"
+ ("vaw")
+ "<ひらが[な]>カタカナ")
+ (evil-test-buffer
+ "[ひ]らがなABC"
+ ("viw")
+ "<ひらが[な]>ABC")
+ (evil-test-buffer
+ "[ひ]らがなABC"
+ ("vaw")
+ "<ひらが[な]>ABC")
+ (evil-test-buffer
+ "[ひ]らがな123"
+ ("viw")
+ "<ひらが[な]>123")
+ (evil-test-buffer
+ "[ひ]らがな123"
+ ("vaw")
+ "<ひらが[な]>123")
+ (evil-test-buffer
+ "[ひ]らがな한글"
+ ("viw")
+ "<ひらが[な]>한글")
+ (evil-test-buffer
+ "[ひ]らがな한글"
+ ("vaw")
+ "<ひらが[な]>한글")
+ (evil-test-buffer
+ "[カ]タカナabcd"
+ ("viw")
+ "<カタカ[ナ]>abcd")
+ (evil-test-buffer
+ "[カ]タカナabcd"
+ ("vaw")
+ "<カタカ[ナ]>abcd")
+ (evil-test-buffer
+ "[カ]タカナ1234"
+ ("viw")
+ "<カタカ[ナ]>1234")
+ (evil-test-buffer
+ "[カ]タカナ1234"
+ ("vaw")
+ "<カタカ[ナ]>1234")
+ (evil-test-buffer
+ "[カ]タカナ漢字"
+ ("viw")
+ "<カタカ[ナ]>漢字")
+ (evil-test-buffer
+ "[カ]タカナ漢字"
+ ("vaw")
+ "<カタカ[ナ]>漢字")
+ (evil-test-buffer
+ "[カ]タカナひらがな"
+ ("viw")
+ "<カタカ[ナ]>ひらがな")
+ (evil-test-buffer
+ "[カ]タカナひらがな"
+ ("vaw")
+ "<カタカ[ナ]>ひらがな")
+ (evil-test-buffer
+ "[カ]タカナカタカナ"
+ ("viw")
+ "<カタカ[ナ]>カタカナ")
+ (evil-test-buffer
+ "[カ]タカナカタカナ"
+ ("vaw")
+ "<カタカ[ナ]>カタカナ")
+ (evil-test-buffer
+ "[カ]タカナABC"
+ ("viw")
+ "<カタカ[ナ]>ABC")
+ (evil-test-buffer
+ "[カ]タカナABC"
+ ("vaw")
+ "<カタカ[ナ]>ABC")
+ (evil-test-buffer
+ "[カ]タカナ123"
+ ("viw")
+ "<カタカ[ナ]>123")
+ (evil-test-buffer
+ "[カ]タカナ123"
+ ("vaw")
+ "<カタカ[ナ]>123")
+ (evil-test-buffer
+ "[カ]タカナ한글"
+ ("viw")
+ "<カタカ[ナ]>한글")
+ (evil-test-buffer
+ "[カ]タカナ한글"
+ ("vaw")
+ "<カタカ[ナ]>한글")
+ (evil-test-buffer
+ "[カ]タカナabcd"
+ ("viw")
+ "<カタカナabc[d]>")
+ (evil-test-buffer
+ "[カ]タカナabcd"
+ ("vaw")
+ "<カタカナabc[d]>")
+ (evil-test-buffer
+ "[カ]タカナ1234"
+ ("viw")
+ "<カタカナ123[4]>")
+ (evil-test-buffer
+ "[カ]タカナ1234"
+ ("vaw")
+ "<カタカナ123[4]>")
+ (evil-test-buffer
+ "[カ]タカナ漢字"
+ ("viw")
+ "<カタカ[ナ]>漢字")
+ (evil-test-buffer
+ "[カ]タカナ漢字"
+ ("vaw")
+ "<カタカ[ナ]>漢字")
+ (evil-test-buffer
+ "[カ]タカナひらがな"
+ ("viw")
+ "<カタカ[ナ]>ひらがな")
+ (evil-test-buffer
+ "[カ]タカナひらがな"
+ ("vaw")
+ "<カタカ[ナ]>ひらがな")
+ (evil-test-buffer
+ "[カ]タカナカタカナ"
+ ("viw")
+ "<カタカ[ナ]>カタカナ")
+ (evil-test-buffer
+ "[カ]タカナカタカナ"
+ ("vaw")
+ "<カタカ[ナ]>カタカナ")
+ (evil-test-buffer
+ "[カ]タカナABC"
+ ("viw")
+ "<カタカナAB[C]>")
+ (evil-test-buffer
+ "[カ]タカナABC"
+ ("vaw")
+ "<カタカナAB[C]>")
+ (evil-test-buffer
+ "[カ]タカナ123"
+ ("viw")
+ "<カタカナ12[3]>")
+ (evil-test-buffer
+ "[カ]タカナ123"
+ ("vaw")
+ "<カタカナ12[3]>")
+ (evil-test-buffer
+ "[カ]タカナ한글"
+ ("viw")
+ "<カタカ[ナ]>한글")
+ (evil-test-buffer
+ "[カ]タカナ한글"
+ ("vaw")
+ "<カタカ[ナ]>한글")
+ (evil-test-buffer
+ "[A]BCabcd"
+ ("viw")
+ "<ABCabc[d]>")
+ (evil-test-buffer
+ "[A]BCabcd"
+ ("vaw")
+ "<ABCabc[d]>")
+ (evil-test-buffer
+ "[A]BC1234"
+ ("viw")
+ "<ABC123[4]>")
+ (evil-test-buffer
+ "[A]BC1234"
+ ("vaw")
+ "<ABC123[4]>")
+ (evil-test-buffer
+ "[A]BC漢字"
+ ("viw")
+ "<AB[C]>漢字")
+ (evil-test-buffer
+ "[A]BC漢字"
+ ("vaw")
+ "<AB[C]>漢字")
+ (evil-test-buffer
+ "[A]BCひらがな"
+ ("viw")
+ "<AB[C]>ひらがな")
+ (evil-test-buffer
+ "[A]BCひらがな"
+ ("vaw")
+ "<AB[C]>ひらがな")
+ (evil-test-buffer
+ "[A]BCカタカナ"
+ ("viw")
+ "<AB[C]>カタカナ")
+ (evil-test-buffer
+ "[A]BCカタカナ"
+ ("vaw")
+ "<AB[C]>カタカナ")
+ (evil-test-buffer
+ "[A]BCカタカナ"
+ ("viw")
+ "<ABCカタカ[ナ]>")
+ (evil-test-buffer
+ "[A]BCカタカナ"
+ ("vaw")
+ "<ABCカタカ[ナ]>")
+ (evil-test-buffer
+ "[A]BC123"
+ ("viw")
+ "<ABC12[3]>")
+ (evil-test-buffer
+ "[A]BC123"
+ ("vaw")
+ "<ABC12[3]>")
+ (evil-test-buffer
+ "[A]BC한글"
+ ("viw")
+ "<AB[C]>한글")
+ (evil-test-buffer
+ "[A]BC한글"
+ ("vaw")
+ "<AB[C]>한글")
+ (evil-test-buffer
+ "[1]23abcd"
+ ("viw")
+ "<123abc[d]>")
+ (evil-test-buffer
+ "[1]23abcd"
+ ("vaw")
+ "<123abc[d]>")
+ (evil-test-buffer
+ "[1]231234"
+ ("viw")
+ "<123123[4]>")
+ (evil-test-buffer
+ "[1]231234"
+ ("vaw")
+ "<123123[4]>")
+ (evil-test-buffer
+ "[1]23漢字"
+ ("viw")
+ "<12[3]>漢字")
+ (evil-test-buffer
+ "[1]23漢字"
+ ("vaw")
+ "<12[3]>漢字")
+ (evil-test-buffer
+ "[1]23ひらがな"
+ ("viw")
+ "<12[3]>ひらがな")
+ (evil-test-buffer
+ "[1]23ひらがな"
+ ("vaw")
+ "<12[3]>ひらがな")
+ (evil-test-buffer
+ "[1]23カタカナ"
+ ("viw")
+ "<12[3]>カタカナ")
+ (evil-test-buffer
+ "[1]23カタカナ"
+ ("vaw")
+ "<12[3]>カタカナ")
+ (evil-test-buffer
+ "[1]23カタカナ"
+ ("viw")
+ "<123カタカ[ナ]>")
+ (evil-test-buffer
+ "[1]23カタカナ"
+ ("vaw")
+ "<123カタカ[ナ]>")
+ (evil-test-buffer
+ "[1]23ABC"
+ ("viw")
+ "<123AB[C]>")
+ (evil-test-buffer
+ "[1]23ABC"
+ ("vaw")
+ "<123AB[C]>")
+ (evil-test-buffer
+ "[1]23한글"
+ ("viw")
+ "<12[3]>한글")
+ (evil-test-buffer
+ "[1]23한글"
+ ("vaw")
+ "<12[3]>한글")
+ (evil-test-buffer
+ "[한]글abcd"
+ ("viw")
+ "<한[글]>abcd")
+ (evil-test-buffer
+ "[한]글abcd"
+ ("vaw")
+ "<한[글]>abcd")
+ (evil-test-buffer
+ "[한]글1234"
+ ("viw")
+ "<한[글]>1234")
+ (evil-test-buffer
+ "[한]글1234"
+ ("vaw")
+ "<한[글]>1234")
+ (evil-test-buffer
+ "[한]글漢字"
+ ("viw")
+ "<한[글]>漢字")
+ (evil-test-buffer
+ "[한]글漢字"
+ ("vaw")
+ "<한[글]>漢字")
+ (evil-test-buffer
+ "[한]글ひらがな"
+ ("viw")
+ "<한[글]>ひらがな")
+ (evil-test-buffer
+ "[한]글ひらがな"
+ ("vaw")
+ "<한[글]>ひらがな")
+ (evil-test-buffer
+ "[한]글カタカナ"
+ ("viw")
+ "<한[글]>カタカナ")
+ (evil-test-buffer
+ "[한]글カタカナ"
+ ("vaw")
+ "<한[글]>カタカナ")
+ (evil-test-buffer
+ "[한]글カタカナ"
+ ("viw")
+ "<한[글]>カタカナ")
+ (evil-test-buffer
+ "[한]글カタカナ"
+ ("vaw")
+ "<한[글]>カタカナ")
+ (evil-test-buffer
+ "[한]글ABC"
+ ("viw")
+ "<한[글]>ABC")
+ (evil-test-buffer
+ "[한]글ABC"
+ ("vaw")
+ "<한[글]>ABC")
+ (evil-test-buffer
+ "[한]글123"
+ ("viw")
+ "<한[글]>123")
+ (evil-test-buffer
+ "[한]글123"
+ ("vaw")
+ "<한[글]>123")))
+
+(ert-deftest evil-test-paragraph-objects ()
+ "Test `evil-inner-paragraph' and `evil-a-paragraph'"
+ :tags '(evil text-object)
+ (ert-info ("Select a paragraph with point at beginning")
+ (evil-test-buffer
+ "[;]; This buffer is for notes,
+;; and for Lisp evaluation.
+
+;; This buffer is for notes,
+;; and for Lisp evaluation."
+ ("vap")
+ "<;; This buffer is for notes,
+;; and for Lisp evaluation.
+\[]\n>\
+;; This buffer is for notes,
+;; and for Lisp evaluation."))
+ (ert-info ("Select a paragraph with point at last line")
+ (evil-test-buffer
+ ";; This buffer is for notes,
+\[;]; and for Lisp evaluation.
+
+;; This buffer is for notes,
+;; and for Lisp evaluation."
+ ("vap")
+ "<;; This buffer is for notes,
+;; and for Lisp evaluation.
+\[]\n>\
+;; This buffer is for notes,
+;; and for Lisp evaluation."))
+ (ert-info ("Select a paragraph with point after paragraph")
+ (evil-test-buffer
+ ";; This buffer is for notes,
+;; and for Lisp evaluation.
+\[]
+;; This buffer is for notes,
+;; and for Lisp evaluation."
+ ("vap")
+ ";; This buffer is for notes,
+;; and for Lisp evaluation.
+<
+;; This buffer is for notes,
+;; and for Lisp evaluation[.]>"))
+ (ert-info ("Select inner paragraph")
+ (evil-test-buffer
+ "[;]; This buffer is for notes,
+;; and for Lisp evaluation.
+
+;; This buffer is for notes,
+;; and for Lisp evaluation."
+ ("vip")
+ "<;; This buffer is for notes,
+;; and for Lisp evaluation.[]
+>
+;; This buffer is for notes,
+;; and for Lisp evaluation.")
+ (evil-test-buffer
+ ";; This buffer is for notes,
+\[;]; and for Lisp evaluation.
+
+;; This buffer is for notes,
+;; and for Lisp evaluation."
+ ("vip")
+ "<;; This buffer is for notes,
+;; and for Lisp evaluation.[]
+>
+;; This buffer is for notes,
+;; and for Lisp evaluation.")
+ (evil-test-buffer
+ ";; This buffer is for notes,
+;; and for Lisp evaluation.
+\[]
+;; This buffer is for notes,
+;; and for Lisp evaluation."
+ ("vip")
+ ";; This buffer is for notes,
+;; and for Lisp evaluation.
+<
+;; This buffer is for notes,
+;; and for Lisp evaluation[.]>")))
+
+(ert-deftest evil-test-quote-objects ()
+ "Test `evil-inner-single-quote' and `evil-a-single-quote'"
+ :tags '(evil text-object)
+ (ert-info ("Select text inside of '...'")
+ (evil-test-buffer
+ "This is 'a [t]est' for quote objects."
+ ("vi'")
+ "This is '<a tes[t]>' for quote objects.")
+ (evil-test-buffer
+ "This is \"a '[t]est'\" for quote objects."
+ ("vi'")
+ "This is \"a '<tes[t]>'\" for quote objects."))
+ (ert-info ("Select text including enclosing quotes")
+ (evil-test-buffer
+ "This is 'a [t]est' for quote objects."
+ ("v2i'")
+ "This is <'a test[']> for quote objects."))
+ (ert-info ("Select text including enclosing quotes and following space")
+ (evil-test-buffer
+ "This is 'a [t]est' for quote objects."
+ ("va'")
+ "This is <'a test'[ ]>for quote objects."))
+ (ert-info ("Select text including enclosing quotes and previous space")
+ (evil-test-buffer
+ "This is 'a [t]est'. For quote objects."
+ ("va'")
+ "This is< 'a test[']>. For quote objects."))
+ (ert-info ("Select text on opening quote")
+ (evil-test-buffer
+ "This is [\"]a test\". For \"quote\" objects."
+ (emacs-lisp-mode)
+ ("va\"")
+ "This is< \"a test[\"]>. For \"quote\" objects."))
+ (ert-info ("Select text on closing quote")
+ (evil-test-buffer
+ "This is \"a test[\"]. For \"quote\" objects."
+ (emacs-lisp-mode)
+ ("va\"")
+ "This is< \"a test[\"]>. For \"quote\" objects."))
+ (ert-info ("Delete text from outside")
+ (evil-test-buffer
+ "Th[i]s is \"a test\". For \"quote\" objects."
+ (emacs-lisp-mode)
+ ("da\"")
+ "This is[.] For \"quote\" objects."))
+ (ert-info ("Operator on empty quotes")
+ (evil-test-buffer
+ "This is [a]n \"\" empty quote"
+ (emacs-lisp-mode)
+ ("ci\"XXX" [escape])
+ "This is an \"XX[X]\" empty quote")))
+
+(ert-deftest evil-test-paren-objects ()
+ "Test `evil-inner-paren', etc."
+ :tags '(evil text-object)
+ (ert-info ("Select inner text")
+ (evil-test-buffer
+ "[(]aaa)"
+ (emacs-lisp-mode) ; syntax
+ ("vi(")
+ "(<aa[a]>)")
+ (evil-test-buffer
+ "(aaa[)]"
+ (emacs-lisp-mode)
+ ("vi(")
+ "(<aa[a]>)")
+ (ert-info ("Next to outer delimiter")
+ (evil-test-buffer
+ "([(]aaa))"
+ (emacs-lisp-mode)
+ ("vi(")
+ "((<aa[a]>))")
+ (evil-test-buffer
+ "((aaa[)])"
+ (emacs-lisp-mode)
+ ("vi(")
+ "((<aa[a]>))")))
+ (ert-info ("Select double inner parentheses")
+ (evil-test-buffer
+ "([(]word))"
+ ("dib")
+ "(())")
+ (evil-test-buffer
+ "[(](word))"
+ ("dib")
+ "()")
+ (evil-test-buffer
+ "((word[)])"
+ ("dib")
+ "(())")
+ (evil-test-buffer
+ "((word)[)]"
+ ("dib")
+ "()"))
+ (ert-info ("Select double outer parentheses")
+ (evil-test-buffer
+ "a([(]word))b"
+ ("dab")
+ "a()b")
+ (evil-test-buffer
+ "a[(](word))b"
+ ("dab")
+ "ab")
+ (evil-test-buffer
+ "a((word[)])b"
+ ("dab")
+ "a()b")
+ (evil-test-buffer
+ "a((word)[)]b"
+ ("dab")
+ "ab"))
+ (ert-info ("Select parentheses inside strings")
+ (evil-test-buffer
+ "(aaa \"b(b[b]b)\" aa)"
+ (emacs-lisp-mode)
+ ("va(")
+ "(aaa \"b<(bbb[)]>\" aa)"))
+ (ert-info ("Break out of empty strings")
+ (evil-test-buffer
+ "(aaa \"bb[b]b\" aa)"
+ (emacs-lisp-mode)
+ ("va(")
+ "<(aaa \"bbbb\" aa[)]>"))
+ (ert-info ("Select inner parentheses around strings")
+ (evil-test-buffer
+ "((\"t[e]st\"))\n"
+ (emacs-lisp-mode)
+ ("vib")
+ "((<\"test[\"]>))\n"
+ ("ib")
+ "(<(\"test\"[)]>)\n")
+ (evil-test-buffer
+ "( ( \"t[e]st\" ) )\n"
+ (emacs-lisp-mode)
+ ("vib")
+ "( (< \"test\"[ ]>) )\n"
+ ("ib")
+ "(< ( \"test\" )[ ]>)\n")
+ (evil-test-buffer
+ "((\"t[e]st\"))\n"
+ (emacs-lisp-mode)
+ ("vhhib")
+ "((<[\"]test\">))\n"
+ ("ib")
+ "(<[(]\"test\")>)\n")
+ (evil-test-buffer
+ "( ( \"t[e]st\" ) )\n"
+ (emacs-lisp-mode)
+ ("vhhib")
+ "( (<[ ]\"test\" >) )\n"
+ ("ib")
+ "(<[ ]( \"test\" ) >)\n"))
+ (ert-info ("Select outer parentheses around strings")
+ (evil-test-buffer
+ "((\"t[e]st\"))\n"
+ (emacs-lisp-mode)
+ ("vab")
+ "(<(\"test\"[)]>)\n"
+ ("ab")
+ "<((\"test\")[)]>\n")
+ (evil-test-buffer
+ "( ( \"t[e]st\" ) )\n"
+ (emacs-lisp-mode)
+ ("vab")
+ "( <( \"test\" [)]> )\n"
+ ("ab")
+ "<( ( \"test\" ) [)]>\n")
+ (evil-test-buffer
+ "((\"t[e]st\"))\n"
+ (emacs-lisp-mode)
+ ("vhhab")
+ "(<[(]\"test\")>)\n"
+ ("ab")
+ "<[(](\"test\"))>\n")
+ (evil-test-buffer
+ "( ( \"t[e]st\" ) )\n"
+ (emacs-lisp-mode)
+ ("vhhab")
+ "( <[(] \"test\" )> )\n"
+ ("ab")
+ "<[(] ( \"test\" ) )>\n")
+ (evil-test-buffer
+ "(([\"]\"))\n"
+ ("dab")
+ "([)]\n"))
+ (ert-info ("Select inner paren on different lines")
+ (evil-test-buffer
+ "for (auto i : vector) {
+ if (cond) {
+ do_[s]omething();
+ }
+}"
+ ("vi}")
+ "for (auto i : vector) {
+ if (cond) {
+< do_something();[\n]> }\n}"
+ ("i}")
+ "for (auto i : vector) {
+< if (cond) {
+ do_something();
+ }[\n]>}"))
+ (ert-info ("Enlarge to smallest complete surrounding")
+ (evil-test-buffer
+ "for (auto i : vector) {
+ if (c<ond) {
+ do_[s]>omething();
+ }
+}"
+ ("i}")
+ "for (auto i : vector) {
+< if (cond) {
+ do_something();
+ }[\n]>}"))
+ (ert-info ("yank on blocks is turned linewise")
+ (evil-test-buffer
+ "{\n [f]oo();\n}\n"
+ ("yiBp")
+ "{\n foo();\n [f]oo();\n}\n"))
+ (ert-info ("exclusive like if ending at bol")
+ (evil-test-buffer
+ "(defun foo ()\n[ ] (insert \"bar\")\n )\n"
+ ("cibx" [escape])
+ "([x]\n )\n"))
+ (ert-info ("Operator on empty parentheses")
+ (evil-test-buffer
+ "a([(]))b"
+ ("cibx" [escape])
+ "a(([x]))b")
+ (evil-test-buffer
+ "a(([)])b"
+ ("cibx" [escape])
+ "a(([x]))b")))
+
+(ert-deftest evil-test-forces-linewise-text-objects ()
+ "Test `evil-text-object-change-visual-type' option."
+ :tags '(evil text-object)
+ (let ((evil-text-object-change-visual-type t))
+ (ert-info ("Change visual type")
+ (evil-test-buffer
+ " function(opts) {
+ this.var1 = something();
+ [t]his.var2 = something_else();
+ return something_nasty();
+ }
+"
+ ("Vi}")
+ " function(opts) {
+< this.var1 = something();
+ this.var2 = something_else();
+ return something_nasty();[
+]> }
+"
+ (should (eq (evil-visual-type) 'inclusive)))))
+ (let ((evil-text-object-change-visual-type nil))
+ (ert-info ("Change visual type keeping linewise")
+ (evil-test-buffer
+ " function(opts) {
+ this.var1 = something();
+ [t]his.var2 = something_else();
+ return something_nasty();
+ }
+"
+ ("Vi}")
+ " function(opts) {
+< this.var1 = something();
+ this.var2 = something_else();
+ return something_nasty();\n> }
+"
+ (should (eq (evil-visual-type) 'line)))))
+ (let ((evil-text-object-change-visual-type nil))
+ (ert-info ("Linewise outer block")
+ (evil-test-buffer
+ " function(opts) {
+ this.var1 = something();
+ [t]his.var2 = something_else();
+ return something_nasty();
+ }
+"
+ ("Va}")
+ "< function(opts) {
+ this.var1 = something();
+ this.var2 = something_else();
+ return something_nasty();
+ }
+>"
+ (should (eq (evil-visual-type) 'line)))))
+ (ert-info ("Forced motion type should change text object type")
+ (evil-test-buffer
+ "for (int i=0; i<10; i++) {
+ if ([c]ond) {
+ do_something();
+ }
+}"
+ ("dVi}")
+ "for (int i=0; i<10; i++) {
+\[}]")))
+
+(ert-deftest evil-test-tag-objects ()
+ "Test `evil-inner-tag', etc."
+ :tags '(evil text-object)
+ (ert-info ("Handle nested tags")
+ (evil-test-buffer
+ :visual-start "{"
+ :visual-end "}"
+ "<p><a>f[o]o</a> bar</p>"
+ ("vit")
+ "<p><a>{fo[o]}</a> bar</p>"))
+ (ert-info ("Break out of tags")
+ (evil-test-buffer
+ :visual-start "{"
+ :visual-end "}"
+ "<a[a]a>bbbb</aaa>"
+ ("vit")
+ "<aaa>{bbb[b]}</aaa>")
+ (evil-test-buffer
+ :visual-start "{"
+ :visual-end "}"
+ "<a[a]a>bbbb</aaa>"
+ ("vat")
+ "{<aaa>bbbb</aaa[>]}"))
+ (ert-info ("Handle quoted strings tags")
+ (evil-test-buffer
+ :visual-start "{"
+ :visual-end "}"
+ "<html>
+<body>
+<div id=\"content\">
+\[ ]
+<p>
+UPDATE
+</p>
+<p>
+test hello <a href=\"/deed.zh\">Creative Commons</a>
+</p>
+</div>
+</body>
+</html>
+"
+ ("vit")
+ "<html>
+<body>
+<div id=\"content\">{\n \n<p>
+UPDATE
+</p>
+<p>
+test hello <a href=\"/deed.zh\">Creative Commons</a>
+</p>[\n]}</div>
+</body>
+</html>
+"))
+ (ert-info ("Handle js arrow fns")
+ (evil-test-buffer
+ :visual-start "«"
+ :visual-end "»"
+ "<button foo=\"bar\" onClick={() => fnbody()}>inner [t]ext</button>"
+ ("vit")
+ "<button foo=\"bar\" onClick={() => fnbody()}>«inner tex[t]»</button>")))
+
+;;; Visual state
+
+(defun evil-test-visual-select (selection &optional mark point)
+ "Verify that TYPE is selected correctly"
+ (let ((type (evil-visual-type selection)))
+ (evil-visual-make-selection mark point type)
+ (ert-info ("Activate region unless SELECTION is `block'")
+ (cond
+ ((eq selection 'block)
+ (should (mark t))
+ (should-not (region-active-p))
+ (should-not transient-mark-mode))
+ (t
+ (should (mark))
+ (should (region-active-p)))))
+ (ert-info ("Refresh Visual markers")
+ (should (= (evil-range-beginning (evil-expand (point) (mark) type))
+ evil-visual-beginning))
+ (should (= (evil-range-end (evil-expand (point) (mark) type))
+ evil-visual-end))
+ (should (eq (evil-visual-type) type))
+ (should (eq evil-visual-direction
+ (if (< (point) (mark)) -1 1))))))
+
+(ert-deftest evil-test-visual-refresh ()
+ "Test `evil-visual-refresh'"
+ :tags '(evil visual)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ (evil-visual-refresh nil nil 'inclusive)
+ (should (= evil-visual-beginning 4))
+ (should (= evil-visual-end 5)))
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ (let ((evil-visual-region-expanded t))
+ (evil-visual-refresh nil nil 'inclusive)
+ (should (= evil-visual-beginning 4))
+ (should (= evil-visual-end 4)))))
+
+(ert-deftest evil-test-visual-exchange ()
+ "Test `exchange-point-and-mark' in Visual character selection"
+ :tags '(evil visual)
+ (evil-test-buffer
+ ";; <[T]his> buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("o")
+ (should (region-active-p))
+ ";; <Thi[s]> buffer is for notes you don't want to save,
+;; and for Lisp evaluation."))
+
+(ert-deftest evil-test-visual-char ()
+ "Test Visual character selection"
+ :tags '(evil visual)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ (evil-test-visual-select 'char)
+ ";; <[T]>his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("e")
+ ";; <Thi[s]> buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("o")
+ ";; <[T]his> buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("d")
+ ";; [ ]buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ ("vV")
+ "<;; [ ]buffer is for notes you don't want to save,\n>\
+;; and for Lisp evaluation.")
+ (ert-info ("Test `evil-want-visual-char-semi-exclusive")
+ (let ((evil-want-visual-char-semi-exclusive t))
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; And a third line."
+ ("v")
+ "<[;]>; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.
+;; And a third line."
+ ("$")
+ "<;; This buffer is for notes you don't want to save,>[
+];; and for Lisp evaluation.
+;; And a third line."
+ ("^jj")
+ "<;; This buffer is for notes you don't want to save,
+;; and for Lisp evaluation.\n>[;]; And a third line."))))
+
+(ert-deftest evil-test-visual-line ()
+ "Test Visual line selection"
+ :tags '(evil visual)
+ (evil-test-buffer
+ ";; [T]his buffer is for notes you don't want to save,
+;; and for Lisp evaluation."
+ (evil-test-visual-select 'line)
+ "<;; [T]his buffer is for notes you don't want to save,\n>\
+;; and for Lisp evaluation."
+ ("e")
+ "<;; Thi[s] buffer is for notes you don't want to save,\n>\
+;; and for Lisp evaluation."
+ ("o")
+ "<;; [T]his buffer is for notes you don't want to save,\n>\
+;; and for Lisp evaluation."
+ ("d")
+ ";; [a]nd for Lisp evaluation."))
+
+(ert-deftest evil-test-visual-block ()
+ "Test Visual block selection"
+ :tags '(evil visual)
+ (evil-test-buffer
+ "[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ (evil-test-visual-select 'block)
+ "<[;]>; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; then enter the text in that file's own buffer."
+ ("jjll")
+ "<;; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;;[ ]>then enter the text in that file's own buffer."
+ ("O")
+ ";; <This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+>[;]; then enter the text in that file's own buffer."
+ ("o")
+ ";;[ ]<This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+>;; then enter the text in that file's own buffer."
+ ("O")
+ "<[;]; This buffer is for notes you don't want to save.
+;; If you want to create a file, visit that file with C-x C-f,
+;; >then enter the text in that file's own buffer."
+ ("d")
+ "This buffer is for notes you don't want to save.
+If you want to create a file, visit that file with C-x C-f,
+then enter the text in that file's own buffer.")
+ (ert-info ("Visual block can select over lines of different length")
+ (evil-test-buffer
+ "Short [l]ine
+A much longer line
+A medium line
+Tiny ln"
+ ("\C-v$jd")
+ "Short[ ]
+A much
+A medium line
+Tiny ln"
+ ("jj\C-v" [end] "jd")
+ "Short
+A much
+A me[d]
+Tiny ")))
+
+(ert-deftest evil-test-visual-restore ()
+ "Test restoring a previous selection"
+ :tags '(evil visual)
+ (ert-info ("Start a characterwise selection \
+if no previous selection")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes."
+ ("gv")
+ ";; <[T]>his buffer is for notes."))
+ (ert-info ("Restore characterwise selection")
+ (evil-test-buffer
+ ";; <[T]his> buffer is for notes."
+ ([escape] "gv")
+ ";; <[T]his> buffer is for notes."))
+ (ert-info ("Restore linewise selection")
+ (evil-test-buffer
+ :visual line
+ "<;; [T]his buffer is for notes.>"
+ ([escape] "gv")
+ "<;; [T]his buffer is for notes.>"))
+ (ert-info ("Restore blockwise selection")
+ (evil-test-buffer
+ :visual block
+ "<;; This buffer is for notes,
+;;[ ]>and for Lisp evaluation."
+ ([escape] "gv")
+ "<;; This buffer is for notes,
+;;[ ]>and for Lisp evaluation.")
+ (ert-info ("After paste shifts initially selected text")
+ (evil-test-buffer
+ :visual block
+ "<1\n2\n[3]>"
+ ("yP")
+ "[1]1\n22\n33"
+ ("gvr*")
+ "[*]1\n*2\n*3")))
+ (ert-info ("Restore linewise visually-pasted selection")
+ (evil-test-buffer
+ "[a]lpha bravo\ncharlie delta
+echo foxtrot\ngolf hotel"
+ ("2yy" "++" "Vp" "gv")
+ "alpha bravo\ncharlie delta
+<alpha bravo\ncharlie delta\n>golf hotel")))
+
+;;; Replace state
+
+(ert-deftest evil-test-replacement ()
+ "Test replacing consecutive characters"
+ :tags '(evil replace)
+ (ert-info ("Replace and restore consecutive characters")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes"
+ ("Rfoo")
+ ";; foo[s] buffer is for notes"
+ ([backspace backspace backspace])
+ ";; [T]his buffer is for notes"))
+ (ert-info ("Replace and restore consecutive characters beyond eol")
+ (evil-test-buffer
+ ";; [T]his buffer is for notes"
+ ("wwwwRxxxxxxx")
+ ";; This buffer is for xxxxxxx[]"
+ ([backspace backspace backspace backspace backspace backspace backspace])
+ ";; This buffer is for [n]otes"))
+ (ert-info ("Replace from line below and restore")
+ (define-key evil-replace-state-map (kbd "C-e") 'evil-copy-from-below)
+ (evil-test-buffer
+ ";; [f]oo bar\n;; qux quux"
+ ("R\C-e\C-e\C-e")
+ ";; qux[ ]bar\n;; qux quux"
+ ([backspace backspace backspace])
+ ";; [f]oo bar\n;; qux quux")
+ (define-key evil-replace-state-map (kbd "C-e") nil))
+ (ert-info ("Replace from line above and restore")
+ (define-key evil-replace-state-map (kbd "C-y") 'evil-copy-from-above)
+ (evil-test-buffer
+ ";; foo bar\n;; [q]ux quux"
+ ("R\C-y\C-y\C-y")
+ ";; foo bar\n;; foo[ ]quux"
+ ([backspace backspace backspace])
+ ";; foo bar\n;; [q]ux quux")
+ (define-key evil-replace-state-map (kbd "C-y") nil)))
+
+;;; Ex
+
+(ert-deftest evil-test-ex-parse ()
+ "Test `evil-ex-parse'"
+ :tags '(evil ex)
+ (should (equal (evil-ex-parse "5,2cmd arg")
+ '(evil-ex-call-command
+ (evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line (string-to-number "2") nil))
+ "cmd"
+ "arg")))
+ (should (equal (evil-ex-parse "5,2cmd !arg")
+ '(evil-ex-call-command
+ (evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line (string-to-number "2") nil))
+ "cmd"
+ "!arg")))
+ (should (equal (evil-ex-parse "5,2 arg")
+ '(evil-ex-call-command
+ (evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line (string-to-number "2") nil))
+ "arg"
+ nil)))
+ (should (equal (evil-ex-parse "+1,+2t-1")
+ '(evil-ex-call-command
+ (evil-ex-range
+ (evil-ex-line
+ nil
+ (+ (evil-ex-signed-number
+ (intern "+")
+ (string-to-number "1"))))
+ (evil-ex-line
+ nil
+ (+ (evil-ex-signed-number
+ (intern "+")
+ (string-to-number "2")))))
+ "t"
+ "-1"))))
+
+(ert-deftest evil-test-ex-parse-ranges ()
+ "Test parsing of ranges"
+ :tags '(evil ex)
+ (should (equal (evil-ex-parse "%" nil 'range)
+ '(evil-ex-full-range)))
+ (should (equal (evil-ex-parse "*" nil 'range)
+ '(evil-ex-last-visual-range)))
+ (should (equal (evil-ex-parse "5,27" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line (string-to-number "27") nil))))
+ (should (equal (evil-ex-parse "5,$" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line (evil-ex-last-line) nil))))
+ (should (equal (evil-ex-parse "5,'x" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line (evil-ex-marker "x") nil))))
+ (should (equal (evil-ex-parse "`x,`y" nil 'range)
+ '(evil-ex-char-marker-range "x" "y")))
+ (should (equal (evil-ex-parse "`[,`]" nil 'range)
+ '(evil-ex-char-marker-range "[" "]")))
+ (should (equal (evil-ex-parse "5,+" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line
+ nil (+ (evil-ex-signed-number (intern "+") nil))))))
+ (should (equal (evil-ex-parse "5,-" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line
+ nil (+ (evil-ex-signed-number (intern "-") nil))))))
+ (should (equal (evil-ex-parse "5,4+2-7-3+10-" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line (string-to-number "5") nil)
+ (evil-ex-line
+ (string-to-number "4")
+ (+ (evil-ex-signed-number
+ (intern "+") (string-to-number "2"))
+ (evil-ex-signed-number
+ (intern "-") (string-to-number "7"))
+ (evil-ex-signed-number
+ (intern "-") (string-to-number "3"))
+ (evil-ex-signed-number
+ (intern "+") (string-to-number "10"))
+ (evil-ex-signed-number (intern "-") nil))))))
+ (should (equal (evil-ex-parse ".-2,4+2-7-3+10-" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line
+ (evil-ex-current-line)
+ (+ (evil-ex-signed-number
+ (intern "-") (string-to-number "2"))))
+ (evil-ex-line
+ (string-to-number "4")
+ (+ (evil-ex-signed-number
+ (intern "+") (string-to-number "2"))
+ (evil-ex-signed-number
+ (intern "-") (string-to-number "7"))
+ (evil-ex-signed-number
+ (intern "-") (string-to-number "3"))
+ (evil-ex-signed-number
+ (intern "+") (string-to-number "10"))
+ (evil-ex-signed-number
+ (intern "-") nil))))))
+ (should (equal (evil-ex-parse "'a-2,$-10" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line
+ (evil-ex-marker "a")
+ (+ (evil-ex-signed-number
+ (intern "-") (string-to-number "2"))))
+ (evil-ex-line
+ (evil-ex-last-line)
+ (+ (evil-ex-signed-number
+ (intern "-") (string-to-number "10")))))))
+ (should (equal (evil-ex-parse "'[,']" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line
+ (evil-ex-marker "[")
+ nil)
+ (evil-ex-line
+ (evil-ex-marker "]")
+ nil))))
+ (should (equal (evil-ex-parse "'{,'}" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line
+ (evil-ex-marker "{")
+ nil)
+ (evil-ex-line
+ (evil-ex-marker "}")
+ nil))))
+ (should (equal (evil-ex-parse "'(,')" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line
+ (evil-ex-marker "(")
+ nil)
+ (evil-ex-line
+ (evil-ex-marker ")")
+ nil))))
+ (should (equal (evil-ex-parse ",']" nil 'range)
+ '(evil-ex-range
+ (evil-ex-current-line)
+ (evil-ex-line
+ (evil-ex-marker "]")
+ nil))))
+ (should (equal (evil-ex-parse ";']" nil 'range)
+ '(evil-ex-range
+ (evil-ex-current-line)
+ (evil-ex-line
+ (evil-ex-marker "]")
+ nil))))
+ (should (equal (evil-ex-parse ".+42" nil 'range)
+ '(evil-ex-range
+ (evil-ex-line
+ (evil-ex-current-line)
+ (+ (evil-ex-signed-number
+ (intern "+") (string-to-number "42"))))
+ nil))))
+
+(ert-deftest evil-test-ex-parse-emacs-commands ()
+ "Test parsing of Emacs commands"
+ :tags '(evil ex)
+ (should (equal (evil-ex-parse "ido-mode")
+ '(evil-ex-call-command nil "ido-mode" nil)))
+ (should (equal (evil-ex-parse "yas/reload-all")
+ '(evil-ex-call-command nil "yas/reload-all" nil)))
+ (should (equal (evil-ex-parse "mu4e")
+ '(evil-ex-call-command nil "mu4e" nil)))
+ (should (equal (evil-ex-parse "make-frame")
+ '(evil-ex-call-command nil "make-frame" nil))))
+
+(ert-deftest evil-text-ex-search-offset ()
+ "Test for addresses like /base//pattern/"
+ :tags '(evil ex)
+ (ert-info ("without base")
+ (evil-test-buffer
+ "[l]ine 1\naaa\nbbb\naaa\nccc\nddd"
+ (":/aaa/d")
+ "line 1\nbbb\naaa\nccc\nddd"))
+ (ert-info ("with base")
+ (evil-test-buffer
+ "[l]ine 1\naaa\nbbb\naaa\nccc\nddd"
+ (":/bbb//aaa/d")
+ "line 1\naaa\nbbb\nccc\nddd"))
+ (ert-info ("range without base")
+ (evil-test-buffer
+ "[l]ine 1\naaa\nbbb\naaa\nccc\nddd\nccc\neee\n"
+ (":/aaa/;/ccc/d")
+ "line 1\nddd\nccc\neee\n"))
+ (ert-info ("range with base")
+ (evil-test-buffer
+ "[l]ine 1\naaa\nbbb\naaa\nccc\nddd\nccc\neee\n"
+ (":/bbb//aaa/;/ddd//ccc/d")
+ "line 1\naaa\nbbb\neee\n")))
+
+(ert-deftest evil-test-ex-goto-line ()
+ "Test if :number moves point to a certain line"
+ :tags '(evil ex)
+ (ert-info ("Move to line")
+ (let ((evil-start-of-line t))
+ (evil-test-buffer
+ :visual line
+ "1\n 2\n [ ]3\n 4\n 5\n"
+ (":4" [return])
+ "1\n 2\n 3\n [4]\n 5\n"
+ (":2" [return])
+ "1\n [2]\n 3\n 4\n 5\n"))))
+
+(ert-deftest evil-test-ex-repeat ()
+ "Test :@: command."
+ :tags '(evil ex)
+ (evil-without-display
+ (ert-info ("Repeat in current line")
+ (evil-test-buffer
+ "[a]bcdef\nabcdef\nabcdef"
+ (":s/[be]/X/g" [return])
+ "[a]XcdXf\nabcdef\nabcdef"
+ ("jj:@:" [return])
+ "aXcdXf\nabcdef\n[a]XcdXf"))
+ (ert-info ("Repeat in specified line")
+ (evil-test-buffer
+ "[a]bcdef\nabcdef\nabcdef"
+ (":s/[be]/X/g" [return])
+ "[a]XcdXf\nabcdef\nabcdef"
+ (":3@:" [return])
+ "aXcdXf\nabcdef\n[a]XcdXf"))
+ (ert-info ("Double repeat, first without then with specified line")
+ (evil-test-buffer
+ "[a]bcdef\nabcdef\nabcdef"
+ (":s/[be]/X/" [return])
+ "[a]Xcdef\nabcdef\nabcdef"
+ ("jj:@:" [return] ":1@:" [return])
+ "[a]XcdXf\nabcdef\naXcdef"))))
+
+(ert-deftest evil-test-ex-repeat2 ()
+ "Test @: command."
+ :tags '(evil ex)
+ (evil-without-display
+ (ert-info ("Repeat in current line")
+ (evil-test-buffer
+ "[a]bcdef\nabcdef\nabcdef"
+ (":s/[be]/X" [return])
+ "[a]Xcdef\nabcdef\nabcdef"
+ ("jj@:")
+ "aXcdef\nabcdef\n[a]Xcdef"))
+ (ert-info ("Repeat with count in current line")
+ (evil-test-buffer
+ "[a]bcdef\nabcdef\nabcdef"
+ (":s/[be]/X" [return])
+ "[a]Xcdef\nabcdef\nabcdef"
+ ("jj2@:")
+ "aXcdef\nabcdef\n[a]XcdXf"))
+ (ert-info ("Do not record dot repeat")
+ (evil-test-buffer
+ ""
+ ("OAAAAAA" [escape] "^")
+ "[A]AAAAA\n"
+ (":s/A/X" [return])
+ "[X]AAAAA\n"
+ ("@:")
+ "[X]XAAAA\n"
+ (".")
+ "AAAAAA\nXXAAAA\n"))))
+
+(ert-deftest evil-test-ex-visual-char-range ()
+ "Test visual character ranges in ex state."
+ :tags '(evil ex visual)
+ (evil-without-display
+ (ert-info ("No character range, inclusive")
+ (let ((evil-visual-char 'inclusive)
+ evil-ex-visual-char-range)
+ (evil-test-buffer
+ "li[n]e 1\nline 2\nline 3\nline 4\n"
+ ("vjll:d" [return])
+ "line 3\nline 4\n")))
+ (ert-info ("No character range, exclusive")
+ (let ((evil-visual-char 'inclusive)
+ evil-ex-visual-char-range)
+ (evil-test-buffer
+ "li[n]e 1\nline 2\nline 3\nline 4\n"
+ ("vjll:d" [return])
+ "line 3\nline 4\n")))
+ (ert-info ("Character range, inclusive")
+ (let ((evil-visual-char 'inclusive)
+ (evil-ex-visual-char-range t))
+ (evil-test-buffer
+ "li[n]e 1\nline 2\nline 3\nline 4\n"
+ ("vjll:d" [return])
+ "li2\nline 3\nline 4\n")))
+ (ert-info ("Character range, exclusive")
+ (let ((evil-visual-char 'exclusive)
+ (evil-ex-visual-char-range t))
+ (evil-test-buffer
+ "li[n]e 1\nline 2\nline 3\nline 4\n"
+ ("vjll:d" [return])
+ "li 2\nline 3\nline 4\n")))))
+
+(ert-deftest evil-test-ex-substitute-replacement ()
+ "Test `evil-ex-substitute' with special replacements."
+ :tags '(evil ex search)
+ (ert-info ("Substitute upper first on first match in line")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar"
+ (":s/\\(foo\\|bar\\)/\\u\\1" [return])
+ "[x]xx Foo bar foo bar foo bar"))
+ (ert-info ("Substitute upper first on first match in line with confirm")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar"
+ (":s/\\(foo\\|bar\\)/\\u\\1/c" [return] "y")
+ "[x]xx Foo bar foo bar foo bar"))
+ (ert-info ("Substitute upper first on whole line")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar"
+ (":s/\\(foo\\|bar\\)/\\u\\1/g" [return])
+ "[x]xx Foo Bar Foo Bar Foo Bar"))
+ (ert-info ("Substitute upper first on whole line")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar"
+ (":s/\\(foo\\|bar\\)/\\u\\1/gc" [return] "yynyyn")
+ "[x]xx Foo Bar foo Bar Foo bar"))
+ (ert-info ("Substitute upper/lower on first match in line")
+ (evil-test-buffer
+ "[x]xx foo BAR foo BAR foo BAR"
+ (":s/\\(f[[:alpha:]]*\\>\\)\\s-*\\(b[[:alpha:]]*\\>\\)/\\L\\2_\\e\\U\\1" [return])
+ "[x]xx bar_FOO foo BAR foo BAR"))
+ (ert-info ("Substitute upper/lower on first match in line with confirm")
+ (evil-test-buffer
+ "[x]xx foo BAR foo BAR foo BAR"
+ (":s/\\(f[[:alpha:]]*\\>\\)\\s-*\\(b[[:alpha:]]*\\>\\)/\\L\\2_\\e\\U\\1/c" [return] "y")
+ "[x]xx bar_FOO foo BAR foo BAR"))
+ (ert-info ("Substitute upper/lower on whole line")
+ (evil-test-buffer
+ "[x]xx foo BAR foo BAR foo BAR"
+ (":s/\\(f[[:alpha:]]*\\>\\)\\s-*\\(b[[:alpha:]]*\\>\\)/\\L\\2_\\e\\U\\1/g" [return])
+ "[x]xx bar_FOO bar_FOO bar_FOO"))
+ (ert-info ("Substitute upper/lower on whole line")
+ (evil-test-buffer
+ "[x]xx foo BAR foo BAR foo BAR"
+ (":s/\\(f[[:alpha:]]*\\>\\)\\s-*\\(b[[:alpha:]]*\\>\\)/\\L\\2_\\e\\U\\1/gc" [return] "yny")
+ "[x]xx bar_FOO foo BAR bar_FOO"))
+ (ert-info ("Substitute with escaped characters in replacement")
+ (evil-test-buffer
+ "[a]bcXdefXghiXjkl\n"
+ (":s/X/\\|\\/\\|/g" [return])
+ "[a]bc|/|def|/|ghi|/|jkl\n"))
+ (ert-info ("Substitute with register")
+ (evil-test-buffer
+ "[a]bc\niiiXiiiXiiiXiii\n"
+ ("\"ayiwj:s/X/\\=@a/g" [return])
+ "abc\n[i]iiabciiiabciiiabciii\n"))
+ (ert-info ("Substitute newlines")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi\n"
+ (":%s/\n/z/" [return])
+ "[a]bczdefzghiz"))
+ (ert-info ("Substitute newlines with g flag")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi\n"
+ (":%s/\n/z/g" [return])
+ "[a]bczdefzghiz"))
+ (ert-info ("Substitute newlines without newline in regexp")
+ (evil-test-buffer
+ "[A]BC\nDEF\nGHI\n"
+ (":%s/[^]]*/z/" [return])
+ "Z"))
+ (ert-info ("Substitute n flag does not replace")
+ (evil-test-buffer
+ "[a]bc\naef\nahi\n"
+ (":%s/a//n" [return])
+ "[a]bc\naef\nahi\n"))
+ (ert-info ("Substitute n flag does not replace with g flag")
+ (evil-test-buffer
+ "[a]bc\naef\nahi\n"
+ (":%s/a//gn" [return])
+ "[a]bc\naef\nahi\n"))
+ (ert-info ("Substitute $ does not loop infinitely")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi"
+ (":%s/$/ END/g" [return])
+ "abc END\ndef END\n[g]hi END"))
+ (ert-info ("Substitute the zero-length beginning of line character")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi"
+ (":s/^/ #/" [return])
+ " [#]abc\ndef\nghi"))
+ (ert-info ("Substitute the zero-length beginning of line character with g flag")
+ (evil-test-buffer
+ "[a]bc\ndef\nghi"
+ (":s/^/ #/g" [return])
+ " [#]abc\ndef\nghi"))
+ (ert-info ("Use Substitute to delete individual characters")
+ (evil-test-buffer
+ "[x]xyxxz"
+ (":%s/x//g" [return])
+ "[y]z"))
+ (ert-info ("Substitute doesn't match final empty line")
+ (evil-test-buffer
+ "abc\n[d]ef\n\nghi"
+ (":s/$/4")
+ "abc\n[d]ef4\n\nghi")
+ (evil-test-buffer
+ "abc\n[d]ef\n\nghi"
+ (":s/f\\w*/4")
+ "abc\n[d]e4\n\nghi")))
+
+(ert-deftest evil-test-ex-repeat-substitute-replacement ()
+ "Test `evil-ex-substitute' with repeating of previous substitutions."
+ :tags '(evil ex search)
+ (ert-info ("Repeat previous pattern")
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar"
+ (":s/foo/AAA" [return])
+ "[x]xx AAA bar foo bar foo bar"
+ (":s//BBB" [return])
+ "[x]xx AAA bar BBB bar foo bar"
+ ("/bar" [return] ":s//CCC" [return])
+ "[x]xx AAA CCC BBB bar foo bar"
+ (":s/ar/XX" [return])
+ "[x]xx AAA CCC BBB bXX foo bar"
+ (":s//YY" [return])
+ "[x]xx AAA CCC BBB bXX foo bYY"))
+ (ert-info ("Repeat previous replacement")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar"
+ (":s/foo/AAA" [return])
+ "[x]xx AAA bar foo bar foo bar"
+ (":s/bar/~" [return])
+ "[x]xx AAA AAA foo bar foo bar"))
+ (ert-info ("Repeat with previous flags")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar"
+ (":s/foo/AAA/g" [return])
+ "[x]xx AAA bar AAA bar AAA bar"
+ (":s/bar/BBB/&" [return])
+ "[x]xx AAA BBB AAA BBB AAA BBB"))
+ (ert-info ("Repeat previous substitute without flags")
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA/g" [return])
+ "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
+ ("j:s" [return])
+ "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar foo bar foo bar"
+ ("/bar" [return] ":s" [return])
+ "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar AAA bar foo bar")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA/g" [return])
+ "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
+ ("j&")
+ "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar foo bar foo bar")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA/g" [return])
+ "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
+ ("j:&" [return])
+ "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar foo bar foo bar"))
+ (ert-info ("Repeat previous substitute with the same flags")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA/g" [return])
+ "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
+ ("j:s//~/&" [return])
+ "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar AAA bar AAA bar")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA/g" [return])
+ "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
+ ("j:&&" [return])
+ "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar AAA bar AAA bar"))
+ (ert-info ("Repeat previous substitute with new flags")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA" [return])
+ "[x]xx AAA bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ ("j:s g" [return])
+ "xxx AAA bar foo bar foo bar\n[x]xx AAA bar AAA bar AAA bar")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA" [return])
+ "[x]xx AAA bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ ("j:& g" [return])
+ "xxx AAA bar foo bar foo bar\n[x]xx AAA bar AAA bar AAA bar"))
+ (ert-info ("Repeat with previous search pattern")
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA" [return])
+ "[x]xx AAA bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ ("/bar" [return])
+ "xxx AAA [b]ar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":2s rg" [return])
+ "xxx AAA bar foo bar foo bar\n[x]xx foo AAA foo AAA foo AAA")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA" [return])
+ "[x]xx AAA bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ ("/bar" [return])
+ "xxx AAA [b]ar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":2~ g" [return])
+ "xxx AAA bar foo bar foo bar\n[x]xx foo AAA foo AAA foo AAA"))
+ (ert-info ("Repeat previous substitute globally")
+ (evil-test-buffer
+ "[x]xx foo bar foo bar foo bar\nxxx foo bar foo bar foo bar"
+ (":s/foo/AAA/g" [return])
+ "[x]xx AAA bar AAA bar AAA bar\nxxx foo bar foo bar foo bar"
+ ("g&")
+ "xxx AAA bar AAA bar AAA bar\n[x]xx AAA bar AAA bar AAA bar")))
+
+(ert-deftest evil-test-ex-regex-without-case ()
+ "Test `evil-ex-regex-without-case'"
+ :tags '(evil ex search)
+ (should (equal (evil-ex-regex-without-case "cdeCDE")
+ "cdeCDE"))
+ (should (equal (evil-ex-regex-without-case "\\ccde\\CCDE")
+ "cdeCDE"))
+ (should (equal (evil-ex-regex-without-case "\\\\ccde\\\\CCDE")
+ "\\\\ccde\\\\CCDE"))
+ (should (equal (evil-ex-regex-without-case "\\\\\\ccde\\\\\\CCDE")
+ "\\\\cde\\\\CDE")))
+
+(ert-deftest evil-test-ex-regex-case ()
+ "Test `evil-ex-regex-case'"
+ :tags '(evil ex search)
+ (should (equal (evil-ex-regex-case "cde" 'smart) 'insensitive))
+ (should (equal (evil-ex-regex-case "cDe" 'smart) 'sensitive))
+ (should (equal (evil-ex-regex-case "cde" 'sensitive) 'sensitive))
+ (should (equal (evil-ex-regex-case "cde" 'insensitive) 'insensitive))
+ (should (equal (evil-ex-regex-case "\\ccde" 'smart) 'insensitive))
+ (should (equal (evil-ex-regex-case "\\cCde" 'smart) 'insensitive))
+ (should (equal (evil-ex-regex-case "\\Ccde" 'smart) 'sensitive))
+ (should (equal (evil-ex-regex-case "\\CCde" 'smart) 'sensitive))
+ (should (equal (evil-ex-regex-case "\\ccd\\Ce" 'smart) 'insensitive))
+ (should (equal (evil-ex-regex-case "\\cCd\\Ce" 'smart) 'insensitive))
+ (should (equal (evil-ex-regex-case "\\Ccd\\ce" 'smart) 'sensitive))
+ (should (equal (evil-ex-regex-case "\\CCd\\ce" 'smart) 'sensitive)))
+
+(ert-deftest evil-test-ex-search ()
+ "Test evil internal search."
+ :tags '(evil ex search)
+ (evil-without-display
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (ert-info ("Test smart case insensitive")
+ (evil-test-buffer
+ "[s]tart you YOU You you YOU You"
+ ("/you" [return])
+ "start [y]ou YOU You you YOU You"
+ ("n")
+ "start you [Y]OU You you YOU You"
+ ("n")
+ "start you YOU [Y]ou you YOU You"
+ ("n")
+ "start you YOU You [y]ou YOU You"))
+ (ert-info ("Test smart case sensitive")
+ (evil-test-buffer
+ "[s]tart you YOU You you YOU You"
+ ("/You" [return])
+ "start you YOU [Y]ou you YOU You"
+ ("n")
+ "start you YOU You you YOU [Y]ou"))
+ (ert-info ("Test insensitive")
+ (evil-test-buffer
+ "[s]tart you YOU You you YOU You"
+ ("/\\cyou" [return])
+ "start [y]ou YOU You you YOU You"
+ ("n")
+ "start you [Y]OU You you YOU You"
+ ("n")
+ "start you YOU [Y]ou you YOU You"
+ ("n")
+ "start you YOU You [y]ou YOU You"))
+ (ert-info ("Test sensitive")
+ (evil-test-buffer
+ "[s]tart you YOU You you YOU You"
+ ("/\\Cyou" [return])
+ "start [y]ou YOU You you YOU You"
+ ("n")
+ "start you YOU You [y]ou YOU You"))
+ (ert-info ("Test failing search does not move point")
+ (evil-test-buffer
+ "foo [f]oo foo\nbar bar2 bar\nbaz baz baz\n"
+ (error search-failed "/foofoo" [return])
+ "foo [f]oo foo\nbar bar2 bar\nbaz baz baz\n"
+ ("/bar2" [return])
+ "foo foo foo\nbar [b]ar2 bar\nbaz baz baz\n"
+ ("dw")
+ "foo foo foo\nbar [b]ar\nbaz baz baz\n"
+ (error search-failed "n")
+ "foo foo foo\nbar [b]ar\nbaz baz baz\n"
+ (error search-failed "N")
+ "foo foo foo\nbar [b]ar\nbaz baz baz\n"))
+ (ert-info ("Test search for newline")
+ (evil-test-buffer
+ "[s]tart\nline 2\nline 3\n\n"
+ ("/\\n" [return])
+ "star[t]\nline 2\nline 3\n\n"
+ ("n")
+ "start\nline [2]\nline 3\n\n"
+ ("n")
+ "start\nline 2\nline [3]\n\n"
+ ("n")
+ "start\nline 2\nline 3\n[]\n"))
+ (ert-info ("Can paste from register in ex-search")
+ (evil-test-buffer
+ "Alpha [b]ravo charlie alpha bravo delta bravo delta"
+ ("\"bye" "w")
+ "Alpha bravo [c]harlie alpha bravo delta bravo delta"
+ ("/\C-rb" [return])
+ "Alpha bravo charlie alpha [b]ravo delta bravo delta"
+ ("w/\C-r\C-o" [return])
+ "Alpha bravo charlie alpha bravo delta bravo [d]elta"))))
+
+(ert-deftest evil-test-ex-search-offset ()
+ "Test search offsets."
+ :tags '(evil ex search)
+ (evil-without-display
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (ert-info ("Test line offsets")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/2")
+ "foo foo\nbar bar\nbaz baz\n[A]nother line\nAnd yet another line"
+ ("?bar?-")
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/r bar/")
+ "foo foo\nba[r] bar\nbaz baz\nAnother line\nAnd yet another line"))
+ (ert-info ("Test end offsets")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/e")
+ "foo foo\nba[r] bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/baz/e+2")
+ "foo foo\nbar bar\nbaz [b]az\nAnother line\nAnd yet another line"
+ ("/line/e-1")
+ "foo foo\nbar bar\nbaz baz\nAnother li[n]e\nAnd yet another line"))
+ (ert-info ("Test begin offsets")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/b")
+ "foo foo\n[b]ar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/baz/b+2")
+ "foo foo\nbar bar\nba[z] baz\nAnother line\nAnd yet another line"
+ ("/line/b-")
+ "foo foo\nbar bar\nbaz baz\nAnother[ ]line\nAnd yet another line"))
+ (ert-info ("Test search-next with offset")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/ ba/+1" [return])
+ "foo foo\nbar bar\n[b]az baz\nAnother line\nAnd yet another line"
+ ("n")
+ "foo foo\nbar bar\nbaz baz\n[A]nother line\nAnd yet another line"))
+ (ert-info ("Test search next after /$")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\n\n\line 4\n"
+ ("/$" [return])
+ "line [1]\nline 2\n\n\line 4\n"
+ ("n")
+ "line 1\nline [2]\n\n\line 4\n"
+ ("n")
+ "line 1\nline 2\n[\n]\line 4\n"
+ ("n")
+ "line 1\nline 2\n\n\line [4]\n"))))
+
+(ert-deftest evil-test-ex-search-pattern-offset ()
+ "Test pattern offsets."
+ :tags '(evil ex search)
+ (evil-without-display
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (ert-info ("Test simple pattern offsets")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nfoo foo\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/;/foo" [return])
+ "foo foo\nbar bar\n[f]oo foo\nbaz baz\nAnother line\nAnd yet another line"))
+ (ert-info ("Test simple pattern offsets in backward direction")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nfoo foo\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/;?foo" [return])
+ "foo [f]oo\nbar bar\nfoo foo\nbaz baz\nAnother line\nAnd yet another line"))
+ (ert-info ("Ensure second pattern is used for search repeat")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nfoo foo\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/;?foo" [return] "n")
+ "foo foo\nbar bar\n[f]oo foo\nbaz baz\nAnother line\nAnd yet another line"))))
+
+(ert-deftest evil-test-ex-search-repeat ()
+ "Test repeat of search."
+ :tags '(evil ex search)
+ (evil-without-display
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (ert-info ("Test repeat of simple pattern")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar" [return] "/" [return])
+ "foo foo\nbar [b]ar\nbaz baz\nAnother line\nAnd yet another line"))
+ (ert-info ("Test repeat of simple pattern with new offset")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar" [return] "//e" [return])
+ "foo foo\nbar ba[r]\nbaz baz\nAnother line\nAnd yet another line"))
+ (ert-info ("Test repeat of pattern with offset")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/e" [return] "/" [return])
+ "foo foo\nbar ba[r]\nbaz baz\nAnother line\nAnd yet another line"))
+ (ert-info ("Test repeat of pattern with offset without offset")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/e" [return] "//" [return])
+ "foo foo\nbar [b]ar\nbaz baz\nAnother line\nAnd yet another line"))
+ (ert-info ("Test repeat of pattern with offset with new offset")
+ (evil-test-buffer
+ "[f]oo foo\nbar bar\nbaz baz\nAnother line\nAnd yet another line"
+ ("/bar/e" [return] "//b+1" [return])
+ "foo foo\nbar b[a]r\nbaz baz\nAnother line\nAnd yet another line"))
+ (ert-info ("Test repeat of pattern in the same search")
+ (evil-test-buffer
+ "[a]lpha bravo charlie delta charlie alpha bravo alpha"
+ ("/charlie/;/")
+ "alpha bravo charlie delta [c]harlie alpha bravo alpha"
+ ("/alpha/;//")
+ "alpha bravo charlie delta charlie alpha bravo [a]lpha"
+ ("?charlie?;?")
+ "alpha bravo [c]harlie delta charlie alpha bravo alpha")
+ (ert-info ("including when switching direction")
+ (evil-test-buffer
+ "[a]lpha bravo charlie delta charlie alpha bravo alpha"
+ ("/bravo/;?")
+ "alpha bravo charlie delta charlie alpha [b]ravo alpha"
+ ("?alpha?;//")
+ "alpha bravo charlie delta charlie alpha bravo [a]lpha")))))
+
+(ert-deftest evil-test-ex-search-word ()
+ "Test search for word under point."
+ :tags '(evil ex search)
+ (evil-without-display
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (setq evil-ex-search-history nil)
+ (evil-test-buffer
+ "so[m]e text with a strange word
+and here some other stuff
+maybe we need one line more with some text\n"
+ (setq evil-symbol-word-search nil)
+ ("*")
+ "some text with a strange word
+and here [s]ome other stuff
+maybe we need one line more with some text\n"
+ ("n")
+ "some text with a strange word
+and here some other stuff
+maybe we need one line more with [s]ome text\n"
+ (ert-info ("Search history")
+ (should (equal evil-ex-search-history '("\\<some\\>"))))
+ ("*")
+ "[s]ome text with a strange word
+and here some other stuff
+maybe we need one line more with some text\n"
+ (ert-info ("Search history with double pattern")
+ (should (equal evil-ex-search-history '("\\<some\\>")))))
+ (ert-info ("Test unbounded search")
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (setq evil-ex-search-history nil)
+ (evil-test-buffer
+ "[s]ymbol\n(defun my-symbolfunc ())\n(defvar my-symbolvar)\nanother symbol\n"
+ ("*")
+ (setq evil-symbol-word-search nil)
+ "symbol\n(defun my-symbolfunc ())\n(defvar my-symbolvar)\nanother [s]ymbol\n"
+ ("ggg*")
+ "symbol\n(defun my-[s]ymbolfunc ())\n(defvar my-symbolvar)\nanother symbol\n"
+ (should (equal evil-ex-search-history '("symbol" "\\<symbol\\>")))
+ ("n")
+ "symbol\n(defun my-symbolfunc ())\n(defvar my-[s]ymbolvar)\nanother symbol\n"))
+ (ert-info ("Test symbol search")
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (evil-test-buffer
+ "(defun my-s[y]mbol-func ())\n(defvar my-symbol-var)\n(my-symbol-func)\n(setq my-symbol-func2 (my-symbol-func))\n"
+ (setq evil-symbol-word-search t)
+ ("*")
+ "(defun my-symbol-func ())\n(defvar my-symbol-var)\n([m]y-symbol-func)\n(setq my-symbol-func2 (my-symbol-func))\n"
+ ("n")
+ "(defun my-symbol-func ())\n(defvar my-symbol-var)\n(my-symbol-func)\n(setq my-symbol-func2 ([m]y-symbol-func))\n"))
+ (ert-info ("Test with non-nil `evil-ex-search-vim-style-regexp'")
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (let ((evil-ex-search-vim-style-regexp t)
+ (evil-magic 'very-magic))
+ (evil-test-buffer
+ "[a]lpha bravo alpha charlie alpha"
+ ("*")
+ "alpha bravo [a]lpha charlie alpha"
+ ("/" [return])
+ "alpha bravo alpha charlie [a]lpha")))))
+
+(ert-deftest evil-test-ex-search-motion ()
+ :tags '(evil ex search)
+ (evil-without-display
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (ert-info ("Ex forward search, as a motion, can be repeated")
+ (evil-test-buffer
+ "alpha [b]ravo charlie delta golf hotel charlie india"
+ ("c/charlie" [return] "replacement " [escape] "4w.")
+ "alpha replacement charlie delta golf replacement[ ]charlie india"))))
+
+(ert-deftest evil-test-ex-search-next+previous-match ()
+ :tags '(evil ex search)
+ (evil-without-display
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (ert-info ("evil-next-match in normal state")
+ (evil-test-buffer
+ "[b]ravo charlie delta charlie alpha charlie bravo"
+ ("/charlie" [return] "e")
+ "bravo charli[e] delta charlie alpha charlie bravo"
+ ("gn")
+ "bravo <charli[e]> delta charlie alpha charlie bravo"
+ ([escape] "b")
+ "bravo [c]harlie delta charlie alpha charlie bravo"
+ ("gn")
+ "bravo <charli[e]> delta charlie alpha charlie bravo"
+ ([escape] "w")
+ "bravo charlie [d]elta charlie alpha charlie bravo"
+ ("gn")
+ "bravo charlie delta <charli[e]> alpha charlie bravo"
+ ([escape] "^")
+ "[b]ravo charlie delta charlie alpha charlie bravo"
+ ("3gn")
+ "bravo charlie delta charlie alpha <charli[e]> bravo"))
+ (ert-info ("evil-previous-match in normal state")
+ (evil-test-buffer
+ "[b]ravo charlie delta charlie alpha charlie bravo"
+ ("/charlie" [return] "e")
+ "bravo charli[e] delta charlie alpha charlie bravo"
+ ("$gN")
+ "bravo charlie delta charlie alpha <[c]harlie> bravo"
+ ([escape] "gN")
+ "bravo charlie delta charlie alpha <[c]harlie> bravo"
+ ([escape] "e" "2gN")
+ "bravo charlie delta <[c]harlie> alpha charlie bravo"))
+ (ert-info ("evil-next-match in visual state")
+ (evil-test-buffer
+ "[b]ravo charlie delta charlie alpha charlie bravo"
+ ("/charlie" [return] "e")
+ "bravo charli[e] delta charlie alpha charlie bravo"
+ ("gn")
+ "bravo <charli[e]> delta charlie alpha charlie bravo"
+ ("gn")
+ "bravo <charlie delta charli[e]> alpha charlie bravo"
+ ("o")
+ "bravo <[c]harlie delta charlie> alpha charlie bravo"
+ ("gn")
+ "bravo charli<[e] delta charlie> alpha charlie bravo"
+ ([escape] "^v2gn")
+ "<bravo charlie delta charli[e]> alpha charlie bravo"))
+ (ert-info ("evil-previous-match in visual state")
+ (evil-test-buffer
+ "bravo charlie delta charlie alpha charlie brav[o]"
+ ("?charlie" [return])
+ "bravo charlie delta charlie alpha [c]harlie bravo"
+ ("gN")
+ "bravo charlie delta charlie alpha <[c]harlie> bravo"
+ ("gN")
+ "bravo charlie delta <[c]harlie alpha charlie> bravo"
+ ("o")
+ "bravo charlie delta <charlie alpha charli[e]> bravo"
+ ("gN")
+ "bravo charlie delta <charlie alpha [c]>harlie bravo"
+ ([escape] "$v2gN")
+ "bravo charlie delta <[c]harlie alpha charlie bravo>"))
+ (ert-info ("evil-match in operator state")
+ (evil-test-buffer
+ "[b]ravo charlie delta charlie alpha charlie bravo"
+ ("/charlie" [return])
+ "bravo [c]harlie delta charlie alpha charlie bravo"
+ ("cgn" "foo" [escape])
+ "bravo fo[o] delta charlie alpha charlie bravo"
+ (".")
+ "bravo foo delta fo[o] alpha charlie bravo"
+ ("$cgN" "bar" [escape])
+ "bravo foo delta foo alpha ba[r] bravo"))
+ (ert-info ("Unfound evil ex next match doesn't move cursor")
+ (evil-test-buffer
+ "[a]lpha bravo"
+ (should-error (execute-kbd-macro "/zulu"))
+ "[a]lpha bravo"
+ (should-error (execute-kbd-macro "gn"))
+ "[a]lpha bravo"))))
+
+(ert-deftest evil-test-isearch-word ()
+ "Test isearch for word under point."
+ :tags '(evil isearch)
+ (evil-without-display
+ (evil-select-search-module 'evil-search-module 'isearch)
+ (evil-test-buffer
+ "so[m]e text with a strange word
+and here some other stuff
+maybe we need one line more with some text\n"
+ (setq evil-symbol-word-search nil)
+ ("*")
+ "some text with a strange word
+and here [s]ome other stuff
+maybe we need one line more with some text\n"
+ ("n")
+ "some text with a strange word
+and here some other stuff
+maybe we need one line more with [s]ome text\n"
+ ("*")
+ "[s]ome text with a strange word
+and here some other stuff
+maybe we need one line more with some text\n")
+ (ert-info ("Test unbounded search")
+ (evil-select-search-module 'evil-search-module 'isearch)
+ (evil-test-buffer
+ "[s]ymbol\n(defun my-symbolfunc ())\n(defvar my-symbolvar)\nanother symbol\n"
+ (setq evil-symbol-word-search nil)
+ ("*")
+ "symbol\n(defun my-symbolfunc ())\n(defvar my-symbolvar)\nanother [s]ymbol\n"
+ ("ggg*")
+ "symbol\n(defun my-[s]ymbolfunc ())\n(defvar my-symbolvar)\nanother symbol\n"
+ ("n")
+ "symbol\n(defun my-symbolfunc ())\n(defvar my-[s]ymbolvar)\nanother symbol\n"))
+ (ert-info ("Test symbol search")
+ (evil-select-search-module 'evil-search-module 'isearch)
+ (evil-test-buffer
+ "(defun my-s[y]mbol-func ())\n(defvar my-symbol-var)\n(my-symbol-func)\n(setq my-symbol-func2 (my-symbol-func))\n"
+ (setq evil-symbol-word-search t)
+ ("*")
+ "(defun my-symbol-func ())\n(defvar my-symbol-var)\n([m]y-symbol-func)\n(setq my-symbol-func2 (my-symbol-func))\n"
+ ("n")
+ "(defun my-symbol-func ())\n(defvar my-symbol-var)\n(my-symbol-func)\n(setq my-symbol-func2 ([m]y-symbol-func))\n"))))
+
+(ert-deftest evil-test-read ()
+ "Test of `evil-read'"
+ :tags '(evil ex)
+ (evil-without-display
+ (ert-info ("Test insertion of file with trailing newline")
+ (evil-with-temp-file name
+ "temp file 1\ntemp file 2\n"
+ (ert-info ("At first line")
+ (evil-test-buffer
+ "[l]ine 1\nline 2"
+ ((vconcat ":read " name [return]))
+ "line 1\n[t]emp file 1\ntemp file 2\nline 2"))
+ (ert-info ("At last line")
+ (evil-test-buffer
+ "line 1\n[l]ine 2"
+ ((vconcat ":read " name [return]))
+ "line 1\nline 2\n[t]emp file 1\ntemp file 2\n"))
+ (ert-info ("After specified line number")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4\line 5"
+ ((vconcat ":3read " name [return]))
+ "line 1\nline 2\nline 3\n[t]emp file 1\ntemp file 2\nline 4\line 5"))
+ (ert-info ("After specified line 0")
+ (evil-test-buffer
+ "line 1\nline [2]\nline 3\nline 4\line 5"
+ ((vconcat ":0read " name [return]))
+ "[t]emp file 1\ntemp file 2\nline 1\nline 2\nline 3\nline 4\line 5"))))
+ (ert-info ("Test insertion of file without trailing newline")
+ (evil-with-temp-file name
+ "temp file 1\ntemp file 2"
+ (evil-test-buffer
+ "[l]ine 1\nline 2"
+ ((vconcat ":read " name [return]))
+ "line 1\n[t]emp file 1\ntemp file 2\nline 2")))
+ (ert-info ("Test insertion of shell command")
+ (ert-info ("with space")
+ (evil-test-buffer
+ "[l]line 1\nline 2"
+ (":read !echo cmd line 1" [return])
+ "line 1\n[c]md line 1\nline 2"))
+ (ert-info ("without space")
+ (evil-test-buffer
+ "[l]line 1\nline 2"
+ (":read!echo cmd line 1" [return])
+ "line 1\n[c]md line 1\nline 2")))
+ (ert-info ("Test substitution of % in shell commands")
+ (evil-with-temp-file name
+ "3\n2\n1\n"
+ (evil-test-buffer
+ ((vconcat ":e " name [return]))
+ "[3]\n2\n1\n"
+ ((vconcat ":read !echo %" [return]))
+ ((vconcat ":w " [return]))
+ (file name (concat "3\n"
+ (buffer-file-name) "\n"
+ "2\n"
+ "1\n")))))
+ (ert-info ("Ensure that point ends up at the last line of shell output, if any")
+ (evil-with-temp-file name
+ "3\n2\n1\n"
+ (evil-test-buffer
+ "[l]ine 1\nline 2"
+ ((vconcat ":read !cat " name [return]))
+ "line 1\n3\n2\n[1]\nline 2")))
+ (ert-info ("Test insertion of shell command without trailing newline")
+ (ert-info ("with space")
+ (evil-test-buffer
+ "[l]line 1\nline 2"
+ (":read !echo -n cmd line 1" [return])
+ "line 1\n[c]md line 1\nline 2"))
+ (ert-info ("without space")
+ (evil-test-buffer
+ "[l]line 1\nline 2"
+ (":read!echo -n cmd line 1" [return])
+ "line 1\n[c]md line 1\nline 2")))))
+
+(ert-deftest evil-test-shell-command ()
+ "Test `evil-shell-command'."
+ (ert-info ("ex shell command")
+ (evil-test-buffer
+ "[l]ine 5\nline 4\nline 3\nline 2\nline 1\n"
+ (":2,3!sort" [return])
+ "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n"))
+ (ert-info ("shell command operator with count")
+ (evil-test-buffer
+ "line 5\n[l]ine 4\nline 3\nline 2\nline 1\n"
+ ("2!!sort" [return])
+ "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n"))
+ (ert-info ("shell command operator with motion")
+ (evil-test-buffer
+ "line 5\n[l]ine 4\nline 3\nline 2\nline 1\n"
+ ("!jsort" [return])
+ "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n"))
+ (ert-info ("shell command operator with backward motion")
+ (evil-test-buffer
+ "line 5\nline 4\n[l]ine 3\nline 2\nline 1\n"
+ ("!ksort" [return])
+ "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n"))
+ (ert-info ("shell command operator with visual selection")
+ (evil-test-buffer
+ "line 5\n[l]ine 4\nline 3\nline 2\nline 1\n"
+ ("vj!sort" [return])
+ "line 5\n[l]ine 3\nline 4\nline 2\nline 1\n")))
+
+(ert-deftest evil-test-global ()
+ "Test `evil-ex-global'."
+ :tags '(evil ex global)
+ (ert-info ("global delete")
+ (evil-test-buffer
+ "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
+ (":g/yes/d" [return])
+ "no 1\nno 2\nno 3\n[n]o 5\nno 6\nno 7\n"))
+ (ert-info ("global substitute")
+ (evil-test-buffer
+ "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
+ (":g/no/s/[3-6]/x" [return])
+ "no 1\nno 2\nno x\nyes 4\nno x\nno x\n[n]o 7\n"
+ ("u")
+ "no 1\nno 2\nno [3]\nyes 4\nno 5\nno 6\nno 7\n"))
+ (ert-info ("global substitute with trailing slash")
+ (evil-test-buffer
+ "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
+ (":g/no/s/[3-6]/x/" [return])
+ "no 1\nno 2\nno x\nyes 4\nno x\nno x\n[n]o 7\n"
+ ("u")
+ "no 1\nno 2\nno [3]\nyes 4\nno 5\nno 6\nno 7\n"))
+ (evil-select-search-module 'evil-search-module 'evil-search)
+ (ert-info ("global use last match if none given, with evil-search")
+ (evil-test-buffer
+ "[n]o 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
+ ("/yes" [return])
+ "no 1\nno 2\nno 3\nyes 4\nno 5\nno 6\nno 7\n"
+ (":g//d" [return])
+ "no 1\nno 2\nno 3\n[n]o 5\nno 6\nno 7\n"
+ (":v//d" [return])
+ ""))
+ (evil-select-search-module 'evil-search-module 'isearch)
+ (ert-info ("global use last match if none given, with isearch")
+ (evil-test-buffer
+ "[n]o 1\nno 2\nno 3\nisearch 4\nno 5\nno 6\nno 7\n"
+ ("/isearch" [return])
+ "no 1\nno 2\nno 3\nisearch 4\nno 5\nno 6\nno 7\n"
+ (":g//d" [return])
+ "no 1\nno 2\nno 3\n[n]o 5\nno 6\nno 7\n"
+ (":v//d" [return])
+ ""))
+ (ert-info (":global should take into account evil-ex-search-case")
+ (evil-with-both-search-modules
+ (let ((evil-ex-search-case 'sensitive))
+ (evil-test-buffer
+ "this\nThis\n"
+ (":g/this/d" [return])
+ "This\n"))
+ (let ((evil-ex-search-case 'insensitive))
+ (evil-test-buffer
+ "this\nThis\n"
+ (":g/this/d" [return])
+ ""))
+ (let ((evil-ex-search-case 'smart))
+ (evil-test-buffer
+ "this\nThis\n"
+ (":g/this/d" [return])
+ "")
+ (evil-test-buffer
+ "this\nThis\n"
+ (":g/This/d" [return])
+ "this\n"))))
+ (ert-info (":global should transform vim-style regexp when appropriate")
+ (let ((evil-ex-search-vim-style-regexp t))
+ (evil-test-buffer
+ "a\n1\nb\n2\nc\n3\n"
+ (":g/\\d/>")
+ "a\n 1\nb\n 2\nc\n 3\n"))))
+
+(ert-deftest evil-test-normal ()
+ "Test `evil-ex-normal'."
+ :tags '(evil ex)
+ (let (evil-want-fine-undo)
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4\nline 5\n"
+ (":normal lxIABC" [escape] "AXYZ" [return])
+ "ABClne 1XY[Z]\nline 2\nline 3\nline 4\nline 5\n"
+ (":3,4normal lxIABC" [escape] "AXYZ" [return])
+ "ABClne 1XYZ\nline 2\nABClne 3XYZ\nABClne 4XY[Z]\nline 5\n"
+ ("u")
+ "ABClne 1XYZ\nline 2\nl[i]ne 3\nline 4\nline 5\n")))
+
+(ert-deftest evil-test-copy ()
+ :tags '(evil ex)
+ "Test `evil-copy'."
+ (ert-info ("Copy to last line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (":2,3copy$")
+ "line1\nline2\nline3\nline4\nline5\nline2\n[l]ine3\n"))
+ (ert-info ("Copy to last incomplete line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5"
+ (":2,3copy$")
+ "line1\nline2\nline3\nline4\nline5\nline2\n[l]ine3\n"))
+ (ert-info ("Copy incomplete line to last incomplete line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5"
+ (":4,5copy$")
+ "line1\nline2\nline3\nline4\nline5\nline4\n[l]ine5\n"))
+ (ert-info ("Copy to first line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (":2,3copy0")
+ "line2\n[l]ine3\nline1\nline2\nline3\nline4\nline5\n"))
+ (ert-info ("Copy to intermediate line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (":2,4copy2")
+ "line1\nline2\nline2\nline3\n[l]ine4\nline3\nline4\nline5\n"))
+ (ert-info ("Copy to current line")
+ (evil-test-buffer
+ "line1\nline2\nline3\nli[n]e4\nline5\n"
+ (":2,4copy.")
+ "line1\nline2\nline3\nline4\nline2\nline3\n[l]ine4\nline5\n")))
+
+(ert-deftest evil-test-move ()
+ :tags '(evil ex)
+ "Test `evil-move'."
+ (ert-info ("Move to last line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (":2,3move$")
+ "line1\nline4\nline5\nline2\n[l]ine3\n"))
+ (ert-info ("Move to last incomplete line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5"
+ (":2,3move$")
+ "line1\nline4\nline5\nline2\n[l]ine3\n"))
+ (ert-info ("Move incomplete line to last incomplete line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5"
+ (":4,5move$")
+ "line1\nline2\nline3\nline4\n[l]ine5\n"))
+ (ert-info ("Move to first line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (":2,3move0")
+ "line2\n[l]ine3\nline1\nline4\nline5\n"))
+ (ert-info ("Move to intermediate line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (":2,4move2")
+ "line1\nline2\nline3\n[l]ine4\nline5\n"))
+ (ert-info ("Move to other line")
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (":2,3move4")
+ "line1\nline4\nline2\n[l]ine3\nline5\n"))
+ (ert-info ("Move to current line")
+ (evil-test-buffer
+ "line1\nline2\nline3\nli[n]e4\nline5\n"
+ (":2,4move.")
+ "line1\nline2\nline3\n[l]ine4\nline5\n"))
+ (ert-info ("Move to backwards line, searching forwards (wrapping around)")
+ (evil-test-buffer
+ "
+Target
+Other line
+[S]ource
+"
+ (":move/Target/")
+ "
+Target
+[S]ource
+Other line
+"))
+ (ert-info ("Move to forwards line, searching backwards (wrapping around)")
+ (evil-test-buffer
+ "
+Target
+[O]ther line
+Source
+"
+ (":move?Source?")
+ "
+Target
+Source
+[O]ther line
+"))
+ (ert-info ("Move with global (classic line reversal)")
+ (evil-test-buffer
+ "5\n4\n3\n2\n1\n"
+ (":g/^/m0")
+ "1\n2\n3\n4\n5\n")
+ (ert-info ("... and visual selection")
+ (evil-test-buffer
+ "<5\n4\n3\n2\n[1]>\n"
+ (":g/^/m0")
+ "1\n2\n3\n4\n5\n"))
+ (ert-info ("... and no last blank line")
+ (evil-test-buffer
+ "5\n4\n3\n2\n1"
+ (":g/^/m0")
+ "1\n2\n3\n4\n5"))))
+
+(ert-deftest evil-test-write ()
+ :tags '(evil ex)
+ "Test `evil-write'."
+ (ert-info ("Write open file")
+ (evil-with-temp-file filename "line1\nline2\nline3\n"
+ (evil-test-buffer
+ ((vconcat ":e " filename [return]))
+ "[l]ine1\nline2\nline3\n"
+ ("Galine4\nline5\n" [escape])
+ "line1\nline2\nline3\nline4\nline5\n"
+ (":w")
+ (file filename "line1\nline2\nline3\nline4\nline5\n"))))
+ (ert-info ("Write current buffer to new file")
+ (let ((filename (make-temp-file "evil-test-write")))
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (delete-file filename)
+ ((vconcat ":w " filename [return]))
+ (file filename "line1\nline2\nline3\nline4\nline5\n")
+ (delete-file filename))))
+ (ert-info ("Write part of a buffer")
+ (let ((filename (make-temp-file "evil-test-write")))
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (delete-file filename)
+ ((vconcat ":2,3w " filename [return]))
+ (file filename "line2\nline3\n")
+ (delete-file filename))))
+ (ert-info ("Appending a file")
+ (let ((filename (make-temp-file "evil-test-write")))
+ (evil-test-buffer
+ "[l]ine1\nline2\nline3\nline4\nline5\n"
+ (delete-file filename)
+ ((vconcat ":4w " filename [return]))
+ (file filename "line4\n")
+ ((vconcat ":1,2w >>" filename [return]))
+ (file filename "line4\nline1\nline2\n")
+ ((vconcat ":w >> " filename [return]))
+ (file filename
+ "line4\nline1\nline2\nline1\nline2\nline3\nline4\nline5\n")
+ (delete-file filename)))))
+
+(ert-deftest evil-test-ex-sort ()
+ :tags '(evil ex)
+ "Text ex command :sort `evil-ex-sort`."
+ (ert-info ("Plain sort")
+ (evil-test-buffer
+ "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
+ (":sort")
+ "[T]EST\ntEst\ntesT\ntest\ntest\nzzyy\n"))
+ (ert-info ("Reverse sort")
+ (evil-test-buffer
+ "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
+ (":sort!")
+ "[z]zyy\ntest\ntest\ntesT\ntEst\nTEST\n"))
+ (ert-info ("case insensitive")
+ (evil-test-buffer
+ "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
+ (":sort i")
+ "[t]est\ntEst\ntesT\nTEST\ntest\nzzyy\n"))
+ (ert-info ("unique")
+ (evil-test-buffer
+ "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
+ (":sort u")
+ "[T]EST\ntEst\ntesT\ntest\nzzyy\n"))
+ (ert-info ("case insensitive and unique")
+ (evil-test-buffer
+ "[z]zyy\ntest\ntEst\ntesT\nTEST\ntest\n"
+ (":sort iu")
+ "[t]est\nzzyy\n")))
+
+;;; Command line window
+
+(ert-deftest evil-test-command-window-ex ()
+ "Test command line window for ex commands"
+ (skip-unless (not noninteractive))
+ (let (evil-ex-history)
+ (evil-test-buffer
+ "[f]oo foo foo"
+ (":s/foo/bar" [return])
+ "[b]ar foo foo"
+ (":s/foo/baz" [return])
+ "[b]ar baz foo"
+ ("q:")
+ "s/foo/bar\ns/foo/baz\n[]\n"
+ ("kk:s/bar/quz" [return])
+ "[s]/foo/quz\ns/foo/baz\n"
+ ("fzrx")
+ "s/foo/qu[x]\ns/foo/baz\n"
+ ([return])
+ "[b]ar baz qux"
+ (should (equal (car evil-ex-history)
+ "s/foo/qux")))))
+
+(ert-deftest evil-test-command-window-recursive ()
+ "Test that recursive command windows shouldn't be allowed"
+ (skip-unless (not noninteractive))
+ (let ((evil-command-window-height 0))
+ (evil-test-buffer
+ "[f]oo foo foo"
+ (":s/foo/bar" [return])
+ ("q:")
+ (should-error (execute-kbd-macro "q:")))))
+
+(ert-deftest evil-test-command-window-noop ()
+ "Test that executing a blank command does nothing"
+ (skip-unless (not noninteractive))
+ (evil-test-buffer
+ "[f]oo foo foo"
+ ("q:")
+ "[]\n"
+ ([return])
+ "[f]oo foo foo"))
+
+(ert-deftest evil-test-command-window-multiple ()
+ "Test that multiple command line windows can't be visible at the same time"
+ (skip-unless (not noninteractive))
+ (let ((evil-command-window-height 0))
+ (evil-test-buffer
+ "[f]oo foo foo"
+ ("q:")
+ (let ((num-windows (length (window-list))))
+ (select-window (previous-window))
+ (execute-kbd-macro "q:")
+ (should (= (length (window-list)) num-windows))))))
+
+(defmacro evil-with-both-search-modules (&rest body)
+ `(mapc (lambda (search-module)
+ (setq evil-search-forward-history nil
+ evil-search-backward-history nil
+ evil-ex-search-history nil)
+ (evil-select-search-module 'evil-search-module search-module)
+ ,@body)
+ '(isearch evil-search)))
+
+(ert-deftest evil-test-command-window-search-history ()
+ "Test command window with forward and backward search history"
+ (skip-unless (not noninteractive))
+ (let ((evil-search-module 'isearch))
+ (evil-test-buffer
+ "[f]oo bar baz qux one two three four"
+ ("/qux" [return])
+ "foo bar baz [q]ux one two three four"
+ ("/three" [return])
+ "foo bar baz qux one two [t]hree four"
+ ("?bar" [return])
+ "foo [b]ar baz qux one two three four"
+ ("/four" [return])
+ "foo bar baz qux one two three [f]our"
+ ("?baz" [return])
+ "foo bar [b]az qux one two three four"
+ ("q/")
+ "qux\nthree\nfour\n[]\n"
+ ("k" [return])
+ "foo bar baz qux one two three [f]our"
+ ("0N")
+ "foo bar baz qux one two three [f]our"
+ ("q?")
+ "bar\nbaz\n[]\n"
+ ("k$rr" [return])
+ "foo [b]ar baz qux one two three four"
+ (should-error
+ (progn (execute-kbd-macro "q/iNOT THERE")
+ (execute-kbd-macro [return])))
+ "foo [b]ar baz qux one two three four")))
+
+(ert-deftest evil-test-command-window-search-word ()
+ "Test command window history when searching for word under cursor"
+ (skip-unless (not noninteractive))
+ (let ((evil-search-module 'isearch))
+ (evil-test-buffer
+ "[f]oo bar foo bar foo"
+ ("**")
+ "foo bar foo bar [f]oo"
+ ("B#")
+ "foo [b]ar foo bar foo"
+ ("q/k" [return])
+ "foo bar [f]oo bar foo"
+ ("q?k" [return])
+ "foo [b]ar foo bar foo")))
+
+;;; Utilities
+
+(ert-deftest evil-test-parser ()
+ "Test `evil-parser'"
+ (let ((grammar '((number "[0-9]+" #'string-to-number)
+ (plus "\\+" #'intern)
+ (minus "-" #'intern)
+ (operator
+ plus
+ minus)
+ (sign
+ ((\? operator) #'$1))
+ (signed-number
+ (sign number))
+ (inc
+ (number #'(lambda (n) (1+ n))))
+ (expr
+ (number operator number)
+ ("2" #'"1+1"))
+ (epsilon nil))))
+ (ert-info ("Nothing")
+ (should (equal (evil-parser "1+2" nil grammar t)
+ nil))
+ (should (equal (evil-parser "1+2" nil grammar)
+ '(nil . "1+2")))
+ (should (equal (evil-parser "1+2" 'epsilon grammar t)
+ nil))
+ (should (equal (evil-parser "1+2" 'epsilon grammar)
+ '(nil . "1+2"))))
+ (ert-info ("Strings")
+ (should (equal (evil-parser "1" 'number grammar t)
+ '((string-to-number "1"))))
+ (should (equal (evil-parser "11" 'number grammar)
+ '((string-to-number "11") . ""))))
+ (ert-info ("Sequences")
+ (should (equal (evil-parser "1" '(number) grammar t)
+ '((list (string-to-number "1")))))
+ (should (equal (evil-parser "1+2" '(number operator number) grammar t)
+ '((list
+ (string-to-number "1")
+ (intern "+")
+ (string-to-number "2"))))))
+ (ert-info ("Symbols")
+ (should (equal (evil-parser "+" 'plus grammar t)
+ '((intern "+"))))
+ (should (equal (evil-parser "+" 'operator grammar t)
+ '((intern "+"))))
+ (should (equal (evil-parser "1" 'number grammar t)
+ '((string-to-number "1")))))
+ (ert-info ("Whitespace")
+ (should (equal (evil-parser " 1" 'number grammar t)
+ '((string-to-number "1")))))
+ (ert-info ("One or more")
+ (should (equal (evil-parser "1 2 3" '(+ number) grammar t)
+ '((list
+ (string-to-number "1")
+ (string-to-number "2")
+ (string-to-number "3")))))
+ (should (equal (evil-parser "1 2 3" '(* number) grammar t)
+ '((list
+ (string-to-number "1")
+ (string-to-number "2")
+ (string-to-number "3")))))
+ (should (equal (evil-parser "1 2 3" '(\? number) grammar)
+ '((string-to-number "1") . " 2 3")))
+ (should (equal (evil-parser "1 2 3" '(\? number number) grammar)
+ '((list
+ (string-to-number "1")
+ (string-to-number "2"))
+ . " 3")))
+ (should (equal (evil-parser "1 2 3" '(number (\? number)) grammar)
+ '((list
+ (string-to-number "1")
+ (string-to-number "2"))
+ . " 3")))
+ (should (equal (evil-parser "1 2 3" '(number (\? number number)) grammar)
+ '((list
+ (string-to-number "1")
+ (list
+ (string-to-number "2")
+ (string-to-number "3")))
+ . "")))
+ (should (equal (evil-parser "1 a 3" '(number (\? number)) grammar)
+ '((list
+ (string-to-number "1")
+ nil)
+ . " a 3")))
+ (should (equal (evil-parser "1" 'signed-number grammar t t)
+ '((signed-number (sign "") (number "1")) . ""))))
+ (ert-info ("Lookahead")
+ (should (equal (evil-parser "foobar" '("foo" (& "bar")) grammar)
+ '((list "foo") . "bar")))
+ (should (equal (evil-parser "foobar" '("foo" (! "bar")) grammar)
+ nil))
+ (should (equal (evil-parser "foobar" '("foo" (& "baz")) grammar)
+ nil))
+ (should (equal (evil-parser "foobar" '("foo" (! "baz")) grammar)
+ '((list "foo") . "bar"))))
+ (ert-info ("Semantic actions")
+ (should (equal (evil-parser "1" 'inc grammar t)
+ '((funcall (lambda (n)
+ (1+ n))
+ (string-to-number "1")))))
+ (should (equal (evil-parser "1+1" 'expr grammar t)
+ '((list
+ (string-to-number "1")
+ (intern "+")
+ (string-to-number "1")))))
+ (should (equal (evil-parser "2" 'expr grammar t)
+ '((list (string-to-number "1")
+ (intern "+")
+ (string-to-number "1"))))))))
+
+(ert-deftest evil-test-delimited-arguments ()
+ "Test `evil-delimited-arguments'"
+ :tags '(evil util)
+ (ert-info ("Any number of arguments")
+ (should (equal (evil-delimited-arguments "/a/b/c/")
+ '("a" "b" "c")))
+ (should (equal (evil-delimited-arguments "/a/b/c")
+ '("a" "b" "c")))
+ (should (equal (evil-delimited-arguments "/a/b//")
+ '("a" "b" "")))
+ (should (equal (evil-delimited-arguments "/a///")
+ '("a" "" "")))
+ (should (equal (evil-delimited-arguments "/a/ ")
+ '("a" " ")))
+ (should (equal (evil-delimited-arguments "/a/")
+ '("a")))
+ (should (equal (evil-delimited-arguments "//b//")
+ '("" "b" "")))
+ (should (equal (evil-delimited-arguments "/a//c")
+ '("a" "" "c")))
+ (should (equal (evil-delimited-arguments "////")
+ '("" "" "")))
+ (should (equal (evil-delimited-arguments "/")
+ nil))
+ (should (equal (evil-delimited-arguments " ")
+ nil))
+ (should (equal (evil-delimited-arguments "")
+ nil)))
+ (ert-info ("Two arguments")
+ (should (equal (evil-delimited-arguments "/a/b/c" 2)
+ '("a" "b/c")))
+ (should (equal (evil-delimited-arguments "/a/b/" 2)
+ '("a" "b")))
+ (should (equal (evil-delimited-arguments "/a/b" 2)
+ '("a" "b")))
+ (should (equal (evil-delimited-arguments "/a//" 2)
+ '("a" "")))
+ (should (equal (evil-delimited-arguments "/a/ " 2)
+ '("a" " ")))
+ (should (equal (evil-delimited-arguments "/a/" 2)
+ '("a" nil)))
+ (should (equal (evil-delimited-arguments "/a" 2)
+ '("a" nil)))
+ (should (equal (evil-delimited-arguments " " 2)
+ '(nil nil)))
+ (should (equal (evil-delimited-arguments "" 2)
+ '(nil nil))))
+ (ert-info ("One argument")
+ (should (equal (evil-delimited-arguments "/a/b/c" 1)
+ '("a/b/c")))
+ (should (equal (evil-delimited-arguments "/a/ " 1)
+ '("a")))
+ (should (equal (evil-delimited-arguments "/a/" 1)
+ '("a")))
+ (should (equal (evil-delimited-arguments "/a" 1)
+ '("a")))
+ (should (equal (evil-delimited-arguments "/" 1)
+ '(nil)))
+ (should (equal (evil-delimited-arguments " " 1)
+ '(nil)))
+ (should (equal (evil-delimited-arguments "" 1)
+ '(nil))))
+ (ert-info ("Zero arguments")
+ (should (equal (evil-delimited-arguments "/a" 0)
+ nil))
+ (should (equal (evil-delimited-arguments "/" 0)
+ nil))
+ (should (equal (evil-delimited-arguments " " 0)
+ nil))
+ (should (equal (evil-delimited-arguments "" 0)
+ nil))))
+
+(ert-deftest evil-test-concat-charsets ()
+ "Test `evil-concat-charsets'"
+ :tags '(evil util)
+ (ert-info ("Bracket")
+ (should (equal (evil-concat-charsets "abc" "]def")
+ "]abcdef")))
+ (ert-info ("Complement")
+ (should (equal (evil-concat-charsets "^abc" "def")
+ "^abcdef"))
+ (should (equal (evil-concat-charsets "^abc" "^def")
+ "^abcdef")))
+ (ert-info ("Hyphen")
+ (should (equal (evil-concat-charsets "abc" "-def")
+ "-abcdef"))
+ (should (equal (evil-concat-charsets "^abc" "-def")
+ "^-abcdef")))
+ (ert-info ("Newline")
+ (should (equal (evil-concat-charsets "^ \t\r\n" "[:word:]_")
+ "^ \t\r\n[:word:]_"))))
+
+(ert-deftest evil-test-properties ()
+ "Test `evil-get-property' and `evil-put-property'"
+ :tags '(evil util)
+ (let (alist)
+ (ert-info ("Set properties")
+ (evil-put-property 'alist 'wibble :foo t)
+ (should (equal alist '((wibble . (:foo t)))))
+ (evil-put-property 'alist 'wibble :bar nil)
+ (should (equal alist '((wibble . (:foo t :bar nil)))))
+ (evil-put-property 'alist 'wobble :foo nil :bar nil :baz t)
+ (should (equal alist '((wobble . (:foo nil :bar nil :baz t))
+ (wibble . (:foo t :bar nil))))))
+ (ert-info ("Get properties")
+ (should (evil-get-property alist 'wibble :foo))
+ (should-not (evil-get-property alist 'wibble :bar))
+ (should-not (evil-get-property alist 'wobble :foo))
+ (should-not (evil-get-property alist 'wibble :baz))
+ (should (equal (evil-get-property alist t :foo)
+ '((wibble . t) (wobble . nil))))
+ (should (equal (evil-get-property alist t :bar)
+ '((wibble . nil) (wobble . nil))))
+ (should (equal (evil-get-property alist t :baz)
+ '((wobble . t)))))))
+
+(ert-deftest evil-test-filter-list ()
+ "Test `evil-filter-list'"
+ :tags '(evil util)
+ (ert-info ("Return filtered list")
+ (should (equal (evil-filter-list #'null '(nil)) nil))
+ (should (equal (evil-filter-list #'null '(nil 1)) '(1)))
+ (should (equal (evil-filter-list #'null '(nil 1 2 nil)) '(1 2)))
+ (should (equal (evil-filter-list #'null '(nil nil 1)) '(1)))
+ (should (equal (evil-filter-list #'null '(nil 1 nil 2 nil 3))
+ '(1 2 3))))
+ (ert-info ("Remove matches by side-effect when possible")
+ (let (list)
+ (setq list '(1 nil))
+ (evil-filter-list #'null list)
+ (should (equal list '(1)))
+
+ (setq list '(1 nil nil))
+ (evil-filter-list #'null list)
+ (should (equal list '(1)))
+
+ (setq list '(1 nil nil 2))
+ (evil-filter-list #'null list)
+ (should (equal list '(1 2)))
+
+ (setq list '(1 nil 2 nil 3))
+ (evil-filter-list #'null list)
+ (should (equal list '(1 2 3))))))
+
+(ert-deftest evil-test-concat-lists ()
+ "Test `evil-concat-lists' and `evil-concat-alists'"
+ :tags '(evil util)
+ (ert-info ("Remove duplicates across lists")
+ (should (equal (evil-concat-lists
+ nil '(a b) '(b c))
+ '(a b c))))
+ (ert-info ("Remove duplicates inside lists")
+ (should (equal (evil-concat-lists
+ '(a a b) nil '(b c) nil)
+ '(a b c))))
+ (ert-info ("Remove duplicate associations")
+ (should (equal (evil-concat-alists
+ '((a . b)) '((a . c)))
+ '((a . c))))
+ (should-not (equal (evil-concat-lists
+ '((a . b)) '((a . c)))
+ '((a . b))))))
+
+(ert-deftest evil-test-sort ()
+ "Test `evil-sort' and `evil-swap'"
+ :tags '(evil util)
+ (let (a b c d)
+ (ert-info ("Two elements")
+ (setq a 2 b 1)
+ (evil-sort a b)
+ (should (= a 1))
+ (should (= b 2))
+ (evil-swap a b)
+ (should (= a 2))
+ (should (= b 1)))
+ (ert-info ("Three elements")
+ (setq a 3 b 1 c 2)
+ (evil-sort a b c)
+ (should (= a 1))
+ (should (= b 2))
+ (should (= c 3)))
+ (ert-info ("Four elements")
+ (setq a 4 b 3 c 2 d 1)
+ (evil-sort a b c d)
+ (should (= a 1))
+ (should (= b 2))
+ (should (= c 3))
+ (should (= d 4)))))
+
+(ert-deftest evil-test-read-key ()
+ "Test `evil-read-key'"
+ :tags '(evil util)
+ (let ((unread-command-events '(?A)))
+ (ert-info ("Prevent downcasing in `this-command-keys'")
+ (should (eq (evil-read-key) ?A))
+ (should (equal (this-command-keys) "A")))))
+
+(ert-deftest evil-test-extract-count ()
+ "Test `evil-extract-count'"
+ :tags '(evil util)
+ (evil-test-buffer
+ (ert-info ("Exact without count")
+ (should (equal (evil-extract-count "x")
+ (list nil 'evil-delete-char "x" nil)))
+ (should (equal (evil-extract-count "g0")
+ (list nil 'evil-beginning-of-visual-line "g0" nil))))
+
+ (ert-info ("Exact with count")
+ (should (equal (evil-extract-count "420x")
+ (list 420 'evil-delete-char "x" nil)))
+ (should (equal (evil-extract-count (vconcat "420" [M-right]))
+ (list 420 (key-binding [M-right]) (vconcat [M-right]) nil)))
+ (should (equal (evil-extract-count "2301g0")
+ (list 2301 'evil-beginning-of-visual-line "g0" nil))))
+
+ (ert-info ("Extra elements without count")
+ (should (equal (evil-extract-count "xAB")
+ (list nil 'evil-delete-char "x" "AB")))
+ (should (equal (evil-extract-count "g0CD")
+ (list nil 'evil-beginning-of-visual-line "g0" "CD"))))
+
+ (ert-info ("Extra elements with count")
+ (should (equal (evil-extract-count "420xAB")
+ (list 420 'evil-delete-char "x" "AB")))
+ (should (equal (evil-extract-count "2301g0CD")
+ (list 2301 'evil-beginning-of-visual-line "g0" "CD"))))
+
+ (ert-info ("Exact \"0\" count")
+ (should (equal (evil-extract-count "0")
+ (list nil 'evil-beginning-of-line
+ "0" nil))))
+
+ (ert-info ("Extra elements and \"0\"")
+ (should (equal (evil-extract-count "0XY")
+ (list nil 'evil-beginning-of-line
+ "0" "XY"))))
+
+ (ert-info ("Count only")
+ (should-error (evil-extract-count "1230")))
+
+ (ert-info ("Unknown command")
+ (should-error (evil-extract-count "°"))
+ (should-error (evil-extract-count "12°")))))
+
+(ert-deftest evil-transform-vim-style-regexp ()
+ "Test `evil-transform-vim-style-regexp'"
+ (dolist (repl '((?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")
+ (?w . "\\w")
+ (?W . "\\W")))
+ (ert-info ((format "Test transform from '\\%c' to '%s'"
+ (car repl) (cdr repl)))
+ (should (equal (evil-transform-vim-style-regexp
+ (concat "xxx\\"
+ (char-to-string (car repl))
+ "\\"
+ (char-to-string (car repl))
+ "\\\\"
+ (char-to-string (car repl))
+ "\\\\\\"
+ (char-to-string (car repl))
+ "yyy"))
+ (concat "xxx"
+ (cdr repl)
+ (cdr repl)
+ "\\\\"
+ (char-to-string (car repl))
+ "\\\\"
+ (cdr repl)
+ "yyy"))))))
+
+;;; Advice
+
+(ert-deftest evil-test-eval-last-sexp ()
+ "Test advised `evil-last-sexp'"
+ :tags '(evil advice)
+ (ert-info ("Normal state")
+ (evil-test-buffer
+ "(+ 1 (+ 2 3[)])"
+ ("1" (kbd "C-x C-e"))
+ "(+ 1 (+ 2 35[)])"))
+ (ert-info ("Insert state")
+ (evil-test-buffer
+ "(+ 1 (+ 2 3[)])"
+ ("i" (kbd "C-u") (kbd "C-x C-e") [escape])
+ "(+ 1 (+ 2 3[3]))"))
+ (ert-info ("Emacs state")
+ (evil-test-buffer
+ "(+ 1 (+ 2 3[)])"
+ ((kbd "C-z") (kbd "C-u") (kbd "C-x C-e"))
+ "(+ 1 (+ 2 33[)])")))
+
+;;; ESC
+
+(ert-deftest evil-test-esc-count ()
+ "Test if prefix-argument is transfered for key sequences with meta-key"
+ :tags '(evil esc)
+ (unless noninteractive
+ (ert-info ("Test M-<right>")
+ (evil-test-buffer
+ "[A]BC DEF GHI JKL MNO"
+ ("3" (kbd "ESC <right>"))
+ "ABC DEF GHI[ ]JKL MNO"))
+ (ert-info ("Test shell-command")
+ (evil-test-buffer
+ "[A]BC DEF GHI JKL MNO"
+ ("1" (kbd "ESC !") "echo TEST" [return])
+ "[T]EST\nABC DEF GHI JKL MNO"))))
+
+(when (or evil-tests-profiler evil-tests-run)
+ (evil-tests-initialize))
+
+(ert-deftest evil-test-black-hole-register ()
+ :tags '(evil)
+ (ert-info ("Test \"_ on delete word")
+ (evil-test-buffer
+ "[E]vil evil is awesome."
+ ("dw\"_dwP")
+ "Evil[ ]is awesome."))
+ (ert-info ("Test \"_ on delete line")
+ (evil-test-buffer
+ "[T]his line is a keeper!\nThis line is not."
+ ("dd\"_ddP")
+ "[T]his line is a keeper!"))
+ (ert-info ("Test \"_ on delete region")
+ (evil-test-buffer
+ "<This region is a keeper>!\nThis line is not."
+ ("d\gg\"_dGP")
+ "This region is a keepe[r]")))
+
+(ert-deftest evil-test-pasteable-macros ()
+ "Test if we can yank and paste macros containing
+ <escape>"
+ :tags '(evil)
+ (ert-info ("Execute yanked macro")
+ (evil-test-buffer
+ "[i]foo\e"
+ ("\"qd$@q\"qp"
+ "fooifoo\e")))
+ (ert-info ("Paste recorded marco")
+ (evil-test-buffer
+ ""
+ (evil-set-register ?q (vconcat "ifoo" [escape]))
+ ("@q\"qp")
+ "fooifoo\e")))
+
+(ert-deftest evil-test-forward-symbol ()
+ :tags '(evil)
+ (ert-info ("Test symbol deletion")
+ (evil-test-buffer
+ "(test [t]his (hello there) with dao)"
+ ("dao")
+ "(test [(]hello there) with dao)"))
+ (ert-info ("Test symbol motion")
+ (evil-test-buffer
+ "(test[ ](hello there) with dao)"
+ (should (eq 0 (forward-evil-symbol 1)))
+ "(test ([h]ello there) with dao)"
+ (should (eq 0 (forward-evil-symbol 1)))
+ "(test (hello[ ]there) with dao)"))
+ (ert-info ("Test dio on whitespace")
+ (evil-test-buffer
+ "(test[ ]dio with whitespace)"
+ ("dio")
+ "(test[d]io with whitespace)"))
+ (ert-info ("Test dao/dio with empty lines")
+ (evil-test-buffer
+ "there are two lines in this file\n[\n]and some whitespace between them"
+ ("dao")
+ "there are two lines in this file\n[a]nd some whitespace between them")
+ (evil-test-buffer
+ "here are another two lines\n[\n]with a blank line between them"
+ ("dio")
+ "here are another two lines\n[w]ith a blank line between them"))
+ (ert-info ("Test dao/dio with empty lines and punctuation")
+ (evil-test-buffer
+ "These two lines \n[\n]!have punctuation on them"
+ ("dao")
+ "These two lines \n[!]have punctuation on them")))
+
+(ert-deftest evil-test-jump ()
+ :tags '(evil jumps)
+ (let ((evil--jumps-buffer-targets "\\*\\(new\\|scratch\\|test\\)\\*"))
+ (ert-info ("Test jumping backward and forward in a single buffer")
+ (evil-test-buffer
+ "[z] z z z z z z z z z"
+ ("/z" [return])
+ "z [z] z z z z z z z z"
+ ("nnnn")
+ "z z z z z [z] z z z z"
+ ("\C-o")
+ "z z z z [z] z z z z z"
+ ("\C-o")
+ "z z z [z] z z z z z z"
+ ("\C-i\C-i")
+ "z z z z z [z] z z z z"))
+ (ert-info ("Test jumping backward and forward with counts")
+ (evil-test-buffer
+ "[z] z z z z z z z z z"
+ ("/z" [return] "nnnn")
+ "z z z z z [z] z z z z"
+ ("3\C-o")
+ "z z [z] z z z z z z z"
+ ("2\C-i")
+ "z z z z [z] z z z z z"
+ ))
+ (ert-info ("Jump list branches off when new jump is set")
+ (evil-test-buffer
+ "[z] z z z z z z z"
+ ("/z" [return] "nnnn4\C-o") ;; adds a bunch of jumps after the 2nd z
+ "z [z] z z z z z z"
+ ("/z" [return]) ;; sets a new jump, list should be reset
+ "z z [z] z z z z z"
+ ("\C-o")
+ "z [z] z z z z z z"
+ ("3\C-i") ;; even after jumping forward 3 times it can't get past the 3rd z
+ "z z [z] z z z z z"))
+ (ert-info ("Jump across files")
+ (let ((temp-file (make-temp-file "evil-test-")))
+ (unwind-protect
+ (evil-test-buffer
+ "[z] z z z z z z"
+ ("\M-x" "find-file" [return] temp-file [return] "inew buffer" [escape])
+ "new buffe[r]"
+ ("\C-o")
+ "[z] z z z z z z"
+ ("\C-i")
+ "new buffe[r]")
+ (delete-file temp-file)
+ (with-current-buffer (get-file-buffer temp-file)
+ (set-buffer-modified-p nil))
+ (kill-buffer (get-file-buffer temp-file)))))))
+
+(ert-deftest evil-test-find-file ()
+ :tags '(evil jumps)
+ (ert-info ("Find file at point (normal state)")
+ (evil-with-temp-file file-name ""
+ (evil-test-buffer
+ (vconcat "i" file-name [escape])
+ (should (not (equal file-name (buffer-file-name (current-buffer)))))
+ ("gf")
+ (should (equal file-name (buffer-file-name (current-buffer)))))))
+ (ert-info ("Find file at point (visual state)")
+ (evil-with-temp-file file-name ""
+ (evil-test-buffer
+ (vconcat "iuser@localhost:" file-name "$" [escape])
+ (should (not (equal file-name (buffer-file-name (current-buffer)))))
+ ("0f:lvt$gf")
+ (should (equal file-name (buffer-file-name (current-buffer)))))))
+ (ert-info ("Find file at point with line number")
+ (let* ((line-number 3)
+ (file-content (make-string (* 2 line-number) ?\n)))
+ (evil-with-temp-file file-name (insert file-content)
+ (evil-test-buffer
+ (vconcat "i" file-name (format ":%d" line-number) [escape])
+ (should (and (not (equal file-name (buffer-file-name (current-buffer))))
+ (not (equal line-number (line-number-at-pos)))))
+ ("gF")
+ (should (and (equal file-name (buffer-file-name (current-buffer)))
+ (equal line-number (line-number-at-pos))))))))
+ (ert-info ("Find file at point with line and column numbers")
+ (let* ((line-number 3)
+ (column-number 5)
+ (file-content (mapconcat 'identity
+ (make-list (* 2 line-number)
+ (make-string (* 2 column-number) ?\s))
+ "\n")))
+ (evil-with-temp-file file-name (insert file-content)
+ (evil-test-buffer
+ (vconcat "i" file-name (format ":%d:%d" line-number column-number) [escape])
+ (should (and (not (equal file-name (buffer-file-name (current-buffer))))
+ (not (equal line-number (line-number-at-pos)))
+ (not (equal column-number (current-column)))))
+ ("gF")
+ (should (and (equal file-name (buffer-file-name (current-buffer)))
+ (equal line-number (line-number-at-pos))
+ (equal column-number (1+ (current-column))))))))))
+
+(ert-deftest evil-test-jump-buffers ()
+ :tags '(evil jumps)
+ (skip-unless nil)
+ (ert-info ("Test jumping backward and forward across buffers")
+ (evil-test-buffer
+ "[z] z z z z z z z z z"
+ (":new" [return] "inew buffer" [escape])
+ "new buffe[r]"
+ ("\C-o")
+ "[z] z z z z z z z z z"
+ ("\C-i")
+ "new buffe[r]")))
+
+(ert-deftest evil-test-abbrev-expand ()
+ :tags '(evil abbrev)
+ (ert-info ("Test abbrev expansion on insert state exit")
+ (define-abbrev-table 'global-abbrev-table
+ '(("undef" "undefined"))) ; add global abbrev
+ (evil-test-buffer
+ "foo unde[f] bar"
+ (abbrev-mode)
+ ("a" [escape])
+ "foo undefine[d] bar") ; 'undef' should be expanded
+ (evil-test-buffer
+ "foo unde[f] bar"
+ ("a" [escape])
+ "foo unde[f] bar") ; 'undef' shouldn't be expanded,
+ ; abbrev-mode is not enabled
+ (evil-test-buffer
+ "fo[o] undef bar"
+ (abbrev-mode)
+ ("a" [escape])
+ "fo[o] undef bar") ; 'foo' shouldn't be expanded,
+ ; it's not an abbrev
+ (kill-all-abbrevs) ; remove all abbrevs
+ (evil-test-buffer
+ "foo unde[f] bar"
+ (abbrev-mode)
+ ("a" [escape])
+ "foo unde[f] bar") ; 'undef' shouldn't be expanded,
+ ; it's not an abbrev
+ (setq abbrevs-changed nil)))
+
+(ert-deftest evil-test-text-object-macro ()
+ :tags '(evil abbrev)
+ (ert-info ("Test pipe character and other delimiters as object delimiters")
+ ;; This is the macro that broke after pull #747.
+ (defmacro evil-test-define-and-bind-text-object (name key start-regex end-regex)
+ (let ((inner-name (make-symbol (concat "evil-inner-" name)))
+ (outer-name (make-symbol (concat "evil-a-" name))))
+ `(progn
+ (evil-define-text-object ,inner-name (count &optional beg end type)
+ (evil-select-paren ,start-regex ,end-regex beg end type count nil))
+ (evil-define-text-object ,outer-name (count &optional beg end type)
+ (evil-select-paren ,start-regex ,end-regex beg end type count t))
+ (define-key evil-inner-text-objects-map ,key #',inner-name)
+ (define-key evil-outer-text-objects-map ,key #',outer-name))))
+ (evil-test-define-and-bind-text-object "pipe" "|" "|" "|")
+ (evil-test-define-and-bind-text-object "rackety" "#" "#|" "|#")
+
+ (evil-test-buffer
+ "#|this i[s] a test #|with rackety|# multiline
+ and nestable comments|#"
+ ("vi#")
+ "#|<this is a test #|with rackety|# multiline
+ and nestable comments>|#")
+ (evil-test-buffer
+ "| foo | aoe[u] | bar |"
+ ("vi|")
+ "| foo |< aoeu >| bar |"
+ ("a|")
+ "| foo <| aoeu |> bar |"
+ ("a|")
+ "<| foo | aoeu | bar |>")
+ (evil-test-buffer
+ "| foo | aoe[u] | bar |"
+ ("ci|testing" [escape])
+ "| foo |testing| bar |")))
+
+(ert-deftest evil-test-undo-kbd-macro ()
+ "Test if evil can undo the changes made by a keyboard macro
+when an error stops the execution of the macro"
+ :tags '(evil undo kbd-macro)
+ (ert-info ("When kbd-macro goes to the end of buffer")
+ (evil-test-buffer
+ "[l]ine 1\nline 2\nline 3\nline 4"
+ (evil-set-register ?q "jdd")
+ ("jdd")
+ (should-error (execute-kbd-macro "2@q"))
+ ("uu")
+ "line 1\n[l]ine 2\nline 3\nline 4"))
+ (ert-info ("When kbd-macro goes to the end of line")
+ (evil-test-buffer
+ "[f]ofof"
+ (evil-set-register ?q "lx")
+ ("lx")
+ (should-error (execute-kbd-macro "2@q"))
+ ("uu")
+ "f[o]fof"))
+ (ert-info ("When kbd-macro goes to the beginning of buffer")
+ (evil-test-buffer
+ "line 1\nline 2\n[l]ine 3"
+ (evil-set-register ?q "kx")
+ ("kx")
+ (should-error (execute-kbd-macro "2@q"))
+ ("uu")
+ "line 1\n[l]ine 2\nline 3")))
+
+(ert-deftest evil-test-visual-update-x-selection ()
+ "Test `evil-visual-update-x-selection'."
+ :tags '(evil)
+ (ert-info ("Buffer argument isn't a live buffer")
+ ;; create buffer in normal mode, so we don't try to actually copy anything to
+ ;; the X selection.
+ (let ((buf (evil-test-buffer-from-string "foobar")))
+ (kill-buffer buf)
+ ;; should not raise an "Selecting deleted buffer" error
+ (evil-visual-update-x-selection buf))))
+
+;;; Core
+
+(ert-deftest evil-test-initial-state ()
+ "Test `evil-initial-state'"
+ :tags '(evil core)
+ (define-derived-mode test-1-mode prog-mode "Test1")
+ (define-derived-mode test-2-mode test-1-mode "Test2")
+ (evil-set-initial-state 'test-1-mode 'insert)
+ (ert-info ("Check default state")
+ (should (eq (evil-initial-state 'prog-mode 'normal) 'normal)))
+ (ert-info ("Basic functionality 1")
+ (should (eq (evil-initial-state 'test-1-mode) 'insert)))
+ (ert-info ("Basic functionality 2")
+ (evil-test-buffer
+ "abc\ndef\n"
+ (test-1-mode)
+ (should (eq evil-state 'insert))))
+ (ert-info ("Inherit initial state from a parent")
+ (evil-test-buffer
+ "abc\ndef\n"
+ (test-2-mode)
+ (should (eq evil-state 'insert))))
+ (evil-set-initial-state 'test-1-mode nil)
+ (ert-info ("Check for inheritance loops")
+ (evil-test-buffer
+ "abc\ndef\n"
+ (unwind-protect
+ (let ((major-mode 'test-2-mode))
+ (put 'test-1-mode 'derived-mode-parent 'test-2-mode)
+ ;; avoid triggering all of the hooks here, some of which might get
+ ;; caught in loops depending on the environment. settings major-mode
+ ;; is sufficient for `evil-initial-state-for-buffer' to work.
+ (should-error (evil-initial-state-for-buffer)))
+ (put 'test-1-mode 'derived-mode-parent 'prog-mode))))
+ (defalias 'test-1-alias-mode 'test-1-mode)
+ (define-derived-mode test-3-mode test-1-alias-mode "Test3")
+ (evil-set-initial-state 'test-1-mode 'insert)
+ (ert-info ("Check inheritance from major mode aliases")
+ "abc\ndef\n"
+ (test-3-mode)
+ (should (eq evil-state 'insert))))
+
+(provide 'evil-tests)
+
+;;; evil-tests.el ends here
diff --git a/elpa/evil-1.15.0/evil-tests.elc b/elpa/evil-1.15.0/evil-tests.elc
new file mode 100644
index 0000000..edf9525
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-tests.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-types.el b/elpa/evil-1.15.0/evil-types.el
new file mode 100644
index 0000000..bc5cd3e
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-types.el
@@ -0,0 +1,462 @@
+;;; 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.15.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 "<N>" ()
+ "Prefix argument or ex-arg, converted to number"
+ (list (cond
+ (current-prefix-arg (prefix-numeric-value current-prefix-arg))
+ ((and evil-ex-argument (evil-ex-p)) (string-to-number evil-ex-argument))
+ ((evil-ex-p) nil)
+ (t 1))))
+
+(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-1.15.0/evil-types.elc b/elpa/evil-1.15.0/evil-types.elc
new file mode 100644
index 0000000..3ceb8b3
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-types.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil-vars.el b/elpa/evil-1.15.0/evil-vars.el
new file mode 100644
index 0000000..7f765e0
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-vars.el
@@ -0,0 +1,2084 @@
+;;; 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.15.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-start-of-line nil
+ "Analogue of vim's `startofline'.
+If nil, preserve column when making relevant movements of the cursor.
+Otherwise, move the cursor to the start of the line."
+ :type 'boolean
+ :group 'evil)
+
+(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 (and (boundp 'evil-insert-state-map)
+ (boundp 'evil-replace-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)
+ (define-key evil-replace-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)
+ (define-key evil-replace-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 (and (boundp 'evil-insert-state-map)
+ (boundp 'evil-replace-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)
+ (define-key evil-replace-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)
+ (define-key evil-replace-state-map (kbd "C-w") 'evil-delete-backward-word))))))
+
+(defcustom evil-want-C-h-delete nil
+ "Whether `C-h' deletes a char in Insert state."
+ :type 'boolean
+ :group 'evil
+ :set #'(lambda (sym value)
+ (set-default sym value)
+ (when (and (boundp 'evil-insert-state-map)
+ (boundp 'evil-replace-state-map))
+ (cond
+ ((and (not value)
+ (eq (lookup-key evil-insert-state-map (kbd "C-h"))
+ 'evil-delete-backward-char-and-join))
+ (define-key evil-insert-state-map (kbd "C-h") nil)
+ (define-key evil-replace-state-map (kbd "C-h") nil))
+ ((and value
+ (not (lookup-key evil-insert-state-map (kbd "C-h"))))
+ (define-key evil-insert-state-map (kbd "C-h") 'evil-delete-backward-char-and-join)
+ (define-key evil-replace-state-map (kbd "C-h") 'evil-replace-backspace))))))
+
+(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)
+
+(defcustom evil-search-wrap-ring-bell nil
+ "Whether to ring the bell when search wraps around the buffer."
+ :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
+ bs-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
+ haskell-interactive-mode
+ prolog-inferior-mode
+ reb-mode
+ shell-mode
+ slime-repl-mode
+ term-mode
+ utop-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 '()
+ "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-incremental t
+ "If t, use incremental search. Note that this only affects the
+search command if `evil-search-module' is set to 'evil-search."
+ :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-last-=-register-input nil
+ "Most recent input from the `=' register. A string.")
+
+(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-operator-start-col nil
+ "Used to restore column (where possible) after an operator has moved it.")
+
+(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-begin)
+ (?\) . evil-forward-sentence-begin)
+ (?{ . 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-previous-point nil
+ "The position of point before 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.")
+
+;; Eval
+(defvar evil-eval-history nil
+ "History of eval input, from the `=' register.")
+
+(defvar evil-eval-map (make-sparse-keymap)
+ "Keymap for eval input.")
+
+;; 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)
+
+(defcustom evil-want-empty-ex-last-command t
+ "Whether to default to evil-ex-previous-command at empty ex prompt."
+ :type 'boolean
+ :group 'evil)
+
+(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.15.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--redo-placeholder (_count)
+ (user-error "Customize `evil-undo-system' for redo functionality."))
+
+(defvar evil-undo-function 'undo
+ "Function to be used by `evil-undo'.
+Customized via `evil-undo-system'.")
+
+(defvar evil-redo-function 'evil--redo-placeholder
+ "Function to be used by 'evil-redo'.
+Customized via `evil-undo-system'.")
+
+(defun evil-set-undo-system (system)
+ "Set `evil-undo-function' and `evil-redo-function` by SYSTEM."
+ (cond
+ ((not system)
+ (setq evil-undo-function 'undo
+ evil-redo-function 'evil--redo-placeholder))
+ ((eq system 'undo-redo)
+ (setq evil-undo-function 'undo-only
+ evil-redo-function 'undo-redo))
+ ((eq system 'undo-tree)
+ (setq evil-undo-function 'undo-tree-undo
+ evil-redo-function 'undo-tree-redo))
+ ((eq system 'undo-fu)
+ (setq evil-undo-function 'undo-fu-only-undo
+ evil-redo-function 'undo-fu-only-redo))
+ (t
+ (error "Unknown undo system %s" system))))
+
+(defcustom evil-undo-system nil
+ "Undo system Evil should use. If equal to `undo-tree' or
+`undo-fu', those packages must be installed. If equal to
+`undo-tree', `undo-tree-mode' must also be activated. If equal
+to `undo-redo', Evil uses commands natively available in Emacs 28."
+ :type '(choice (const :tag "Vanilla undo" nil)
+ (const undo-redo)
+ (const undo-tree)
+ (const undo-fu))
+ :group 'evil
+ :set #'(lambda (sym value)
+ (evil-set-undo-system value)
+ (set-default sym value)))
+
+(defcustom evil-visual-update-x-selection-p t
+ "Whether to update the X PRIMARY selection with the current visual region automatically."
+ :type 'boolean
+ :group 'evil)
+
+(defun evil-version ()
+ (interactive)
+ (message "Evil version %s" evil-version))
+
+(provide 'evil-vars)
+
+;;; evil-vars.el ends here
diff --git a/elpa/evil-1.15.0/evil-vars.elc b/elpa/evil-1.15.0/evil-vars.elc
new file mode 100644
index 0000000..5ae5a74
--- /dev/null
+++ b/elpa/evil-1.15.0/evil-vars.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil.el b/elpa/evil-1.15.0/evil.el
new file mode 100644
index 0000000..8a8a3f3
--- /dev/null
+++ b/elpa/evil-1.15.0/evil.el
@@ -0,0 +1,158 @@
+;;; 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>
+
+;; The following line is included for NonGNU ELPA's build script:
+;; Maintainer: Tom Dalziel <tom.dalziel@gmail.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.15.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-redo (Emacs 28), undo-fu or undo-tree for redo
+;; functionality. Otherwise, Evil uses regular Emacs undo.
+;;
+;; https://gitlab.com/ideasman42/emacs-undo-fu
+;; https://melpa.org/#/undo-fu
+;; https://gitlab.com/tsc25/undo-tree
+;; https://elpa.gnu.org/packages/undo-tree.html
+;;
+;; 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:
+;;
+;; https://github.com/emacs-evil/goto-chg
+;; https://melpa.org/#/goto-chg
+;; https://elpa.nongnu.org/nongnu/goto-chg.html
+;;
+;; 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-1.15.0/evil.elc b/elpa/evil-1.15.0/evil.elc
new file mode 100644
index 0000000..858e3ab
--- /dev/null
+++ b/elpa/evil-1.15.0/evil.elc
Binary files differ
diff --git a/elpa/evil-1.15.0/evil.info b/elpa/evil-1.15.0/evil.info
new file mode 100644
index 0000000..a9dfc01
--- /dev/null
+++ b/elpa/evil-1.15.0/evil.info
@@ -0,0 +1,2235 @@
+This is dochsi1MJ.info, produced by makeinfo version 6.8 from evil.texi.
+
+ Evil 1.15.0, Jan 07, 2022
+
+ 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 4.3.2.
+
+
+File: dochsi1MJ.info, Node: Top, Next: Overview, Up: (dir)
+
+Evil documentation
+******************
+
+ Evil 1.15.0, Jan 07, 2022
+
+ 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: dochsi1MJ.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: dochsi1MJ.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, MELPA unstable and
+NonGNU ELPA. This is the recommended way of installing Evil.
+
+To set up ‘package.el’ to work with one of the MELPA repositories, you
+can follow the instructions on melpa.org(1).
+
+Alternatively you can use NonGNU ELPA. It is part of the default package
+archives as of Emacs 28. For older Emacs versions you’ll need to add it
+yourself:
+
+ (add-to-list 'package-archives
+ (cons "nongnu" (format "http%s://elpa.nongnu.org/nongnu/"
+ (if (gnutls-available-p) "s" ""))))
+
+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: dochsi1MJ.info, Node: Manual installation, Next: Modes and states, Prev: Installation via package el, Up: Overview
+
+1.2 Manual installation
+=======================
+
+First, install ‘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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: 30.
+
+ -- 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:
+ 30. 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: dochsi1MJ.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: 4f. 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: 37. are always available. If
+ this is non-nil, default Emacs bindings are by and large accessible
+ in insert state.
+
+ Default: ‘nil’
+
+
+File: dochsi1MJ.info, Node: Search, Next: Indentation, Prev: Keybindings and other behaviour, Up: Settings
+
+2.3 Search
+==========
+
+ -- Emacs Lisp Autovariable: evil-search-module
+
+ The search module to be used. May be either ‘isearch’, for Emacs’
+ isearch module, or ‘evil-search’, for Evil’s own interactive search
+ module. N.b. changing this will not affect keybindings. To swap
+ out relevant keybindings, see ‘evil-select-search-module’ function.
+
+ Default: ‘isearch’
+
+ -- 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: dochsi1MJ.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: 33.
+
+ 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: dochsi1MJ.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’
+
+ -- Emacs Lisp Autovariable: evil-start-of-line
+
+ Analogue of vim’s ‘startofline’. If nil, preserve column when
+ making relevant movements of the cursor. Otherwise, move the
+ cursor to the start of the line.
+
+ Default: ‘nil’
+
+
+File: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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-undo-system
+
+ Undo system Evil should use. If equal to ‘undo-tree’ or ‘undo-fu’,
+ those packages must be installed. If equal to ‘undo-tree’,
+ ‘undo-tree-mode’ must also be activated. If equal to ‘undo-redo’,
+ Evil uses commands natively available in Emacs 28.
+
+ 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’
+
+ -- Emacs Lisp Autovariable: evil-want-empty-ex-last-command
+
+ Whether to default to evil-ex-previous-command at empty ex prompt.
+
+ Default: ‘t’
+
+
+File: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: 31. 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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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: dochsi1MJ.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 would be satisfied by having the ‘*’ and ‘#’ searches use symbols
+instead of words, this can be achieved by setting the
+‘evil-symbol-word-search’ variable to ‘t’.
+
+If you want the underscore to be recognised as word character for other
+motions, 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.
+
+Similarly to Emacs’ definition of a word, the definition of a “symbol”
+is also dependent on the syntax-class of the buffer, which often
+includes the underscore. The default text objects keymap associates
+kbd::‘o’ with the symbol object, making kbd::‘cio’ a good alternative to
+Vim’s kbd::‘ciw’, for example. The following will swap between the word
+and symbol objects in the keymap:
+
+ (define-key evil-outer-text-objects-map "w" 'evil-a-symbol)
+ (define-key evil-inner-text-objects-map "w" 'evil-inner-symbol)
+ (define-key evil-outer-text-objects-map "o" 'evil-a-word)
+ (define-key evil-inner-text-objects-map "o" 'evil-inner-word)
+
+This will not change the motion keys, however. 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: dochsi1MJ.info, Node: Internals, Next: The GNU Free Documentation License, Prev: Frequently Asked Questions, Up: Top
+
+7 Internals
+***********
+
+* Menu:
+
+* Command properties::
+
+
+File: dochsi1MJ.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: 2f.
+
+ -- 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: dochsi1MJ.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: dochsi1MJ.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-module: 2a.
+* evil-search-wrap: 2b.
+* evil-select-an-object: 2c.
+* evil-select-inner-object: 2d.
+* evil-select-paren: 2e.
+* evil-set-command-properties: 2f.
+* evil-set-initial-state: 30.
+* evil-set-leader: 31.
+* evil-shift-round: 32.
+* evil-shift-width: 33.
+* evil-show-paren-range: 34.
+* evil-split-window-below: 35.
+* evil-start-of-line: 36.
+* evil-toggle-key: 37.
+* evil-track-eol: 38.
+* evil-undo-system: 39.
+* evil-vsplit-window-right: 3a.
+* evil-want-C-d-scroll: 3b.
+* evil-want-C-i-jump: 3c.
+* evil-want-C-u-delete: 3d.
+* evil-want-C-u-scroll: 3e.
+* evil-want-C-w-delete: 3f.
+* evil-want-C-w-in-emacs-state: 40.
+* evil-want-empty-ex-last-command: 41.
+* evil-want-fine-undo: 42.
+* evil-want-Y-yank-to-eol: 43.
+
+
+
+Tag Table:
+Node: Top369
+Ref: index doc621
+Ref: 44621
+Node: Overview1453
+Ref: overview doc1533
+Ref: 451533
+Ref: overview evil1533
+Ref: 461533
+Ref: overview overview1533
+Ref: 471533
+Ref: Overview-Footnote-11886
+Node: Installation via package el2138
+Ref: overview installation-via-package-el2241
+Ref: 482241
+Ref: Installation via package el-Footnote-13176
+Node: Manual installation3220
+Ref: overview manual-installation3348
+Ref: 493348
+Node: Modes and states3886
+Ref: overview modes-and-states3978
+Ref: 4a3978
+Node: Settings5729
+Ref: settings doc5813
+Ref: 4b5813
+Ref: settings settings5813
+Ref: 4c5813
+Ref: Settings-Footnote-16572
+Node: The initial state6713
+Ref: settings the-initial-state6818
+Ref: 4d6818
+Ref: settings elispobj-evil-set-initial-state7093
+Ref: 307093
+Ref: settings elispobj-evil-default-state7332
+Ref: d7332
+Ref: settings elispobj-evil-buffer-regexps7943
+Ref: 57943
+Node: Keybindings and other behaviour8436
+Ref: settings keybindings-and-other-behaviour8556
+Ref: 4e8556
+Ref: settings elispobj-evil-toggle-key8778
+Ref: 378778
+Ref: settings elispobj-evil-want-C-i-jump8978
+Ref: 3c8978
+Ref: settings elispobj-evil-want-C-u-delete9168
+Ref: 3d9168
+Ref: settings elispobj-evil-want-C-u-scroll9487
+Ref: 3e9487
+Ref: settings elispobj-evil-want-C-d-scroll9780
+Ref: 3b9780
+Ref: settings elispobj-evil-want-C-w-delete9903
+Ref: 3f9903
+Ref: settings elispobj-evil-want-C-w-in-emacs-state10033
+Ref: 4010033
+Ref: settings elispobj-evil-want-Y-yank-to-eol10183
+Ref: 4310183
+Ref: settings elispobj-evil-disable-insert-state-bindings10378
+Ref: 1510378
+Node: Search10706
+Ref: settings search10820
+Ref: 5010820
+Ref: settings elispobj-evil-search-module10843
+Ref: 2a10843
+Ref: settings elispobj-evil-regexp-search11228
+Ref: 2711228
+Ref: settings elispobj-evil-search-wrap11379
+Ref: 2b11379
+Ref: settings elispobj-evil-flash-delay11585
+Ref: 1911585
+Ref: settings elispobj-evil-ex-hl-update-delay11728
+Ref: 1811728
+Node: Indentation12001
+Ref: settings indentation12099
+Ref: 5112099
+Ref: settings elispobj-evil-auto-indent12132
+Ref: 212132
+Ref: settings elispobj-evil-shift-width12290
+Ref: 3312290
+Ref: settings elispobj-evil-shift-round12496
+Ref: 3212496
+Ref: settings elispobj-evil-indent-convert-tabs12757
+Ref: 1e12757
+Node: Cursor movement13026
+Ref: settings cursor-movement13132
+Ref: 5213132
+Ref: settings elispobj-evil-repeat-move-cursor13711
+Ref: 2813711
+Ref: settings elispobj-evil-move-cursor-back13975
+Ref: 2613975
+Ref: settings elispobj-evil-move-beyond-eol14320
+Ref: 2514320
+Ref: settings elispobj-evil-cross-lines14562
+Ref: 714562
+Ref: settings elispobj-evil-respect-visual-line-mode14957
+Ref: 2914957
+Ref: settings elispobj-evil-track-eol15472
+Ref: 3815472
+Ref: settings elispobj-evil-start-of-line15840
+Ref: 3615840
+Node: Cursor display16094
+Ref: settings cursor-display16206
+Ref: 5316206
+Ref: settings elispobj-evil-default-cursor16550
+Ref: c16550
+Node: Window management16833
+Ref: settings window-management16954
+Ref: 5416954
+Ref: settings elispobj-evil-auto-balance-windows16999
+Ref: 116999
+Ref: settings elispobj-evil-split-window-below17145
+Ref: 3517145
+Ref: settings elispobj-evil-vsplit-window-right17274
+Ref: 3a17274
+Node: Parenthesis highlighting17427
+Ref: settings parenthesis-highlighting17547
+Ref: 5517547
+Ref: settings elispobj-evil-show-paren-range17736
+Ref: 3417736
+Ref: settings elispobj-evil-highlight-closing-paren-at-point-states17923
+Ref: 1d17923
+Node: Miscellaneous18509
+Ref: settings miscellaneous18603
+Ref: 5618603
+Ref: settings elispobj-evil-want-fine-undo18640
+Ref: 4218640
+Ref: settings elispobj-evil-undo-system19279
+Ref: 3919279
+Ref: settings elispobj-evil-backspace-join-lines19638
+Ref: 319638
+Ref: settings elispobj-evil-kbd-macro-suppress-motion-error19779
+Ref: 2019779
+Ref: settings elispobj-evil-mode-line-format20534
+Ref: 2320534
+Ref: settings elispobj-evil-mouse-word21066
+Ref: 2421066
+Ref: settings elispobj-evil-bigword21407
+Ref: 421407
+Ref: settings elispobj-evil-esc-delay21711
+Ref: 1721711
+Ref: settings elispobj-evil-intercept-esc22117
+Ref: 1f22117
+Ref: settings elispobj-evil-kill-on-visual-paste22743
+Ref: 2122743
+Ref: settings elispobj-evil-echo-state23004
+Ref: 1623004
+Ref: settings elispobj-evil-complete-all-buffers23133
+Ref: 623133
+Ref: settings elispobj-evil-want-empty-ex-last-command23334
+Ref: 4123334
+Node: Keymaps23492
+Ref: keymaps doc23573
+Ref: 5723573
+Ref: keymaps chapter-keymaps23573
+Ref: 4f23573
+Ref: keymaps keymaps23573
+Ref: 5823573
+Ref: keymaps elispobj-evil-global-set-key25225
+Ref: 1c25225
+Ref: keymaps elispobj-evil-local-set-key25329
+Ref: 2225329
+Node: evil-define-key25758
+Ref: keymaps evil-define-key25840
+Ref: 5925840
+Ref: keymaps elispobj-evil-define-key26094
+Ref: f26094
+Node: Leader keys29291
+Ref: keymaps leader-keys29373
+Ref: 5a29373
+Ref: keymaps elispobj-evil-set-leader29900
+Ref: 3129900
+Node: Hooks30353
+Ref: hooks doc30435
+Ref: 5b30435
+Ref: hooks hooks30435
+Ref: 5c30435
+Node: Extension31087
+Ref: extension doc31188
+Ref: 5d31188
+Ref: extension extension31188
+Ref: 5e31188
+Node: Motions31424
+Ref: extension motions31498
+Ref: 5f31498
+Ref: extension elispobj-evil-declare-motion31751
+Ref: 931751
+Ref: extension elispobj-evil-define-motion31924
+Ref: 1031924
+Node: Operators33315
+Ref: extension operators33410
+Ref: 6033410
+Ref: extension elispobj-evil-define-operator33658
+Ref: 1133658
+Node: Text objects35263
+Ref: extension text-objects35362
+Ref: 6135362
+Ref: extension elispobj-evil-define-text-object35902
+Ref: 1335902
+Ref: extension elispobj-evil-select-inner-object37406
+Ref: 2d37406
+Ref: extension elispobj-evil-select-an-object37976
+Ref: 2c37976
+Ref: extension elispobj-evil-select-paren38543
+Ref: 2e38543
+Ref: Text objects-Footnote-139465
+Node: Range types39631
+Ref: extension range-types39727
+Ref: 6239727
+Ref: extension elispobj-evil-define-type40030
+Ref: 1440030
+Node: States41199
+Ref: extension states41274
+Ref: 6341274
+Ref: extension elispobj-evil-define-state41574
+Ref: 1241574
+Node: Frequently Asked Questions43003
+Ref: faq doc43108
+Ref: 6443108
+Ref: faq frequently-asked-questions43108
+Ref: 6543108
+Node: Problems with the escape key in the terminal43265
+Ref: faq problems-with-the-escape-key-in-the-terminal43418
+Ref: 6643418
+Node: Underscore is not a word character45912
+Ref: faq underscore-is-not-a-word-character46065
+Ref: 6746065
+Ref: Underscore is not a word character-Footnote-148663
+Node: Internals48974
+Ref: internals doc49104
+Ref: 6849104
+Ref: internals internals49104
+Ref: 6949104
+Node: Command properties49162
+Ref: internals command-properties49229
+Ref: 6a49229
+Ref: internals elispobj-evil-add-command-properties49484
+Ref: 049484
+Ref: internals elispobj-evil-set-command-properties49744
+Ref: 2f49744
+Ref: internals elispobj-evil-get-command-properties50057
+Ref: 1a50057
+Ref: internals elispobj-evil-get-command-property50223
+Ref: 1b50223
+Ref: internals elispobj-evil-define-command50493
+Ref: e50493
+Ref: internals elispobj-evil-declare-repeat50697
+Ref: b50697
+Ref: internals elispobj-evil-declare-not-repeat50799
+Ref: a50799
+Ref: internals elispobj-evil-declare-change-repeat50908
+Ref: 850908
+Ref: Command properties-Footnote-151099
+Node: The GNU Free Documentation License51276
+Ref: license doc51414
+Ref: 6b51414
+Ref: license the-gnu-free-documentation-license51414
+Ref: 6c51414
+Node: Emacs lisp functions and variables75222
+
+End Tag Table
+
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/elpa/exwm-0.33.signed b/elpa/exwm-0.33.signed
new file mode 100644
index 0000000..1e84616
--- /dev/null
+++ b/elpa/exwm-0.33.signed
@@ -0,0 +1 @@
+Good signature from 645357D2883A0966 GNU ELPA Signing Agent (2023) <elpasign@elpa.gnu.org> (trust undefined) created at 2025-01-25T22:05:01+0000 using EDDSA \ No newline at end of file
diff --git a/elpa/exwm-0.33/.elpaignore b/elpa/exwm-0.33/.elpaignore
new file mode 100644
index 0000000..f0f644e
--- /dev/null
+++ b/elpa/exwm-0.33/.elpaignore
@@ -0,0 +1,2 @@
+LICENSE
+README.md
diff --git a/elpa/exwm-0.33/exwm-autoloads.el b/elpa/exwm-0.33/exwm-autoloads.el
new file mode 100644
index 0000000..4c27d75
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-autoloads.el
@@ -0,0 +1,224 @@
+;;; exwm-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*-
+;; Generated by the `loaddefs-generate' function.
+
+;; This file is part of GNU Emacs.
+
+;;; Code:
+
+(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path)))
+
+
+
+;;; Generated autoloads from exwm.el
+
+(autoload 'exwm-enable "exwm" "\
+Enable/Disable EXWM.
+Optional argument UNDO may be either of the following symbols:
+- `undo' prevents reinitialization.
+- `undo-all' attempts to revert all hooks and advice.
+
+(fn &optional UNDO)")
+(register-definition-prefixes "exwm" '("exwm-"))
+
+
+;;; Generated autoloads from exwm-background.el
+
+(defvar exwm-background-mode nil "\
+Non-nil if Exwm-Background mode is enabled.
+See the `exwm-background-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 `exwm-background-mode'.")
+(custom-autoload 'exwm-background-mode "exwm-background" nil)
+(autoload 'exwm-background-mode "exwm-background" "\
+Toggle EXWM background support.
+
+This is a global minor mode. If called interactively, toggle the
+`Exwm-Background mode' mode. If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'. Enable the
+mode if ARG is nil, omitted, or is a positive number. Disable the mode
+if ARG is a negative number.
+
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value \\='exwm-background-mode)'.
+
+The mode's hook is called both when the mode is enabled and when it is
+disabled.
+
+(fn &optional ARG)" t)
+(register-definition-prefixes "exwm-background" '("exwm-background-"))
+
+
+;;; Generated autoloads from exwm-core.el
+
+(register-definition-prefixes "exwm-core" '("exwm-"))
+
+
+;;; Generated autoloads from exwm-floating.el
+
+(autoload 'exwm-floating-toggle-floating "exwm-floating" "\
+Toggle the current window between floating and non-floating states." t)
+(autoload 'exwm-floating-hide "exwm-floating" "\
+Hide the current floating X window (which would show again when selected)." t)
+(register-definition-prefixes "exwm-floating" '("exwm-floating-"))
+
+
+;;; Generated autoloads from exwm-input.el
+
+(register-definition-prefixes "exwm-input" '("exwm-input-"))
+
+
+;;; Generated autoloads from exwm-layout.el
+
+(register-definition-prefixes "exwm-layout" '("exwm-layout-"))
+
+
+;;; Generated autoloads from exwm-manage.el
+
+(register-definition-prefixes "exwm-manage" '("exwm-manage-"))
+
+
+;;; Generated autoloads from exwm-randr.el
+
+(defvar exwm-randr-mode nil "\
+Non-nil if Exwm-Randr mode is enabled.
+See the `exwm-randr-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 `exwm-randr-mode'.")
+(custom-autoload 'exwm-randr-mode "exwm-randr" nil)
+(autoload 'exwm-randr-mode "exwm-randr" "\
+Toggle EXWM randr support.
+
+This is a global minor mode. If called interactively, toggle the
+`Exwm-Randr mode' mode. If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'. Enable the
+mode if ARG is nil, omitted, or is a positive number. Disable the mode
+if ARG is a negative number.
+
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value \\='exwm-randr-mode)'.
+
+The mode's hook is called both when the mode is enabled and when it is
+disabled.
+
+(fn &optional ARG)" t)
+(register-definition-prefixes "exwm-randr" '("exwm-randr-"))
+
+
+;;; Generated autoloads from exwm-systemtray.el
+
+(defvar exwm-systemtray-mode nil "\
+Non-nil if Exwm-Systemtray mode is enabled.
+See the `exwm-systemtray-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 `exwm-systemtray-mode'.")
+(custom-autoload 'exwm-systemtray-mode "exwm-systemtray" nil)
+(autoload 'exwm-systemtray-mode "exwm-systemtray" "\
+Toggle EXWM systemtray support.
+
+This is a global minor mode. If called interactively, toggle the
+`Exwm-Systemtray mode' mode. If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'. Enable the
+mode if ARG is nil, omitted, or is a positive number. Disable the mode
+if ARG is a negative number.
+
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value \\='exwm-systemtray-mode)'.
+
+The mode's hook is called both when the mode is enabled and when it is
+disabled.
+
+(fn &optional ARG)" t)
+(register-definition-prefixes "exwm-systemtray" '("exwm-systemtray-"))
+
+
+;;; Generated autoloads from exwm-workspace.el
+
+(register-definition-prefixes "exwm-workspace" '("exwm-workspace-"))
+
+
+;;; Generated autoloads from exwm-xim.el
+
+(defvar exwm-xim-mode nil "\
+Non-nil if Exwm-Xim mode is enabled.
+See the `exwm-xim-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 `exwm-xim-mode'.")
+(custom-autoload 'exwm-xim-mode "exwm-xim" nil)
+(autoload 'exwm-xim-mode "exwm-xim" "\
+Toggle EXWM XIM support.
+
+This is a global minor mode. If called interactively, toggle the
+`Exwm-Xim mode' mode. If the prefix argument is positive, enable the
+mode, and if it is zero or negative, disable the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'. Enable the
+mode if ARG is nil, omitted, or is a positive number. Disable the mode
+if ARG is a negative number.
+
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value \\='exwm-xim-mode)'.
+
+The mode's hook is called both when the mode is enabled and when it is
+disabled.
+
+(fn &optional ARG)" t)
+(register-definition-prefixes "exwm-xim" '("exwm-xim-"))
+
+
+;;; Generated autoloads from exwm-xsettings.el
+
+(defvar exwm-xsettings-mode nil "\
+Non-nil if Exwm-Xsettings mode is enabled.
+See the `exwm-xsettings-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 `exwm-xsettings-mode'.")
+(custom-autoload 'exwm-xsettings-mode "exwm-xsettings" nil)
+(autoload 'exwm-xsettings-mode "exwm-xsettings" "\
+Toggle EXWM xsettings support.
+
+This is a global minor mode. If called interactively, toggle the
+`Exwm-Xsettings mode' mode. If the prefix argument is positive, enable
+the mode, and if it is zero or negative, disable the mode.
+
+If called from Lisp, toggle the mode if ARG is `toggle'. Enable the
+mode if ARG is nil, omitted, or is a positive number. Disable the mode
+if ARG is a negative number.
+
+To check whether the minor mode is enabled in the current buffer,
+evaluate `(default-value \\='exwm-xsettings-mode)'.
+
+The mode's hook is called both when the mode is enabled and when it is
+disabled.
+
+(fn &optional ARG)" t)
+(register-definition-prefixes "exwm-xsettings" '("exwm-xsettings"))
+
+;;; End of scraped data
+
+(provide 'exwm-autoloads)
+
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; no-native-compile: t
+;; coding: utf-8-emacs-unix
+;; End:
+
+;;; exwm-autoloads.el ends here
diff --git a/elpa/exwm-0.33/exwm-background.el b/elpa/exwm-0.33/exwm-background.el
new file mode 100644
index 0000000..8d43405
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-background.el
@@ -0,0 +1,204 @@
+;;; exwm-background.el --- X Background Module for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022-2025 Free Software Foundation, Inc.
+
+;; Author: Steven Allen <steven@stebalien.com>
+
+;; 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 module adds X background color setting support to EXWM.
+
+;; To use this module, enable it as follows:
+;;
+;; (exwm-background-mode 1)
+;;
+;; By default, this will apply the theme's background color. However, that
+;; color can be customized via the `exwm-background-color' setting.
+
+;;; Code:
+
+(require 'exwm-core)
+
+(defgroup exwm-background nil
+ "Background support."
+ :group 'exwm)
+
+;;;###autoload
+(define-minor-mode exwm-background-mode
+ "Toggle EXWM background support."
+ :global t
+ :group 'exwm-background
+ (exwm--global-minor-mode-body background))
+
+(defcustom exwm-background-color nil
+ "Background color for Xorg."
+ :type '(choice
+ (color :tag "Background Color")
+ (const :tag "Default" nil))
+ :initialize #'custom-initialize-default
+ :set (lambda (symbol value)
+ (set-default-toplevel-value symbol value)
+ (when exwm-background-mode (exwm-background--update))))
+
+(defconst exwm-background--properties '("_XROOTPMAP_ID" "_XSETROOT_ID" "ESETROOT_PMAP_ID")
+ "The background properties to set.
+We can't need to set these so that compositing window managers
+can correctly display the background color.")
+
+(defvar exwm-background--connection nil
+ "The X connection used for setting the background.
+We use a separate connection as other background-setting tools
+may kill this connection when they replace it.")
+
+(defvar exwm-background--pixmap nil
+ "Cached background pixmap.")
+
+(defvar exwm-background--atoms nil
+ "Cached background atoms.")
+
+(defun exwm-background--update (&rest _)
+ "Update the EXWM background."
+
+ ;; Always reconnect as any tool that sets the background may have disconnected us (to force X to
+ ;; free resources).
+ (exwm-background--connect)
+
+ (let ((gc (xcb:generate-id exwm-background--connection))
+ (color (exwm--color->pixel (or exwm-background-color
+ (face-background 'default)))))
+ ;; Fill the pixmap.
+ (xcb:+request exwm-background--connection
+ (make-instance 'xcb:CreateGC
+ :cid gc :drawable exwm-background--pixmap
+ :value-mask (logior xcb:GC:Foreground
+ xcb:GC:GraphicsExposures)
+ :foreground color
+ :graphics-exposures 0))
+
+ (xcb:+request exwm-background--connection
+ (make-instance 'xcb:PolyFillRectangle
+ :gc gc :drawable exwm-background--pixmap
+ :rectangles
+ (list
+ (make-instance
+ 'xcb:RECTANGLE
+ :x 0 :y 0 :width 1 :height 1))))
+ (xcb:+request exwm-background--connection (make-instance 'xcb:FreeGC :gc gc)))
+
+ ;; Reapply it to force an update (also clobber anyone else who may have set it).
+ (xcb:+request exwm-background--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window exwm--root
+ :value-mask xcb:CW:BackPixmap
+ :background-pixmap exwm-background--pixmap))
+
+ (let (old)
+ ;; Collect old pixmaps so we can kill other background clients (all the background setting tools
+ ;; seem to do this).
+ (dolist (atom exwm-background--atoms)
+ (when-let* ((reply (xcb:+request-unchecked+reply exwm-background--connection
+ (make-instance 'xcb:GetProperty
+ :delete 0
+ :window exwm--root
+ :property atom
+ :type xcb:Atom:PIXMAP
+ :long-offset 0
+ :long-length 1)))
+ (value (vconcat (slot-value reply 'value)))
+ ((length= value 4))
+ (pixmap (funcall (if xcb:lsb #'xcb:-unpack-u4-lsb #'xcb:-unpack-u4)
+ value 0))
+ ((not (or (= pixmap exwm-background--pixmap)
+ (member pixmap old)))))
+ (push pixmap old)))
+
+ ;; Change the background.
+ (dolist (atom exwm-background--atoms)
+ (xcb:+request exwm-background--connection
+ (make-instance 'xcb:ChangeProperty
+ :window exwm--root
+ :property atom
+ :type xcb:Atom:PIXMAP
+ :format 32
+ :mode xcb:PropMode:Replace
+ :data-len 1
+ :data
+ (funcall (if xcb:lsb
+ #'xcb:-pack-u4-lsb
+ #'xcb:-pack-u4)
+ exwm-background--pixmap))))
+
+ ;; Kill the old background clients.
+ (dolist (pixmap old)
+ (xcb:+request exwm-background--connection
+ (make-instance 'xcb:KillClient :resource pixmap))))
+
+ (xcb:flush exwm-background--connection))
+
+(defun exwm-background--connected-p ()
+ "Return t if a live background connection process exists and is connected."
+ (and exwm-background--connection
+ (process-live-p (slot-value exwm-background--connection 'process))))
+
+(defun exwm-background--connect ()
+ "Establish background Pixmap connection."
+ (unless (exwm-background--connected-p)
+ (setq exwm-background--connection (xcb:connect))
+ ;;prevent query message on exit
+ (set-process-query-on-exit-flag (slot-value exwm-background--connection 'process) nil)
+
+ ;; Intern the background property atoms.
+ (setq exwm-background--atoms
+ (mapcar
+ (lambda (prop) (exwm--intern-atom prop exwm-background--connection))
+ exwm-background--properties))
+
+ ;; Create the pixmap.
+ (setq exwm-background--pixmap (xcb:generate-id exwm-background--connection))
+ (xcb:+request exwm-background--connection
+ (make-instance 'xcb:CreatePixmap
+ :depth
+ (slot-value
+ (xcb:+request-unchecked+reply exwm-background--connection
+ (make-instance 'xcb:GetGeometry :drawable exwm--root))
+ 'depth)
+ :pid exwm-background--pixmap
+ :drawable exwm--root
+ :width 1 :height 1))))
+
+(defun exwm-background--init ()
+ "Initialize background module."
+ (exwm--log)
+ (add-hook 'enable-theme-functions 'exwm-background--update)
+ (add-hook 'disable-theme-functions 'exwm-background--update)
+ (exwm-background--update))
+
+(defun exwm-background--exit ()
+ "Uninitialize the background module."
+ (exwm--log)
+ (remove-hook 'enable-theme-functions 'exwm-background--update)
+ (remove-hook 'disable-theme-functions 'exwm-background--update)
+ (when (and exwm-background--connection
+ (slot-value exwm-background--connection 'connected))
+ (xcb:disconnect exwm-background--connection))
+ (setq exwm-background--pixmap nil
+ exwm-background--connection nil
+ exwm-background--atoms nil))
+
+(provide 'exwm-background)
+;;; exwm-background.el ends here
diff --git a/elpa/exwm-0.33/exwm-background.elc b/elpa/exwm-0.33/exwm-background.elc
new file mode 100644
index 0000000..a162801
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-background.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-core.el b/elpa/exwm-0.33/exwm-core.el
new file mode 100644
index 0000000..44a52ff
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-core.el
@@ -0,0 +1,438 @@
+;;; exwm-core.el --- Core definitions -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 module includes core definitions of variables, macros, functions, etc
+;; shared by various other modules.
+
+;;; Code:
+
+(require 'compat)
+(require 'kmacro)
+
+(require 'xcb)
+(require 'xcb-icccm)
+(require 'xcb-ewmh)
+(require 'xcb-debug)
+
+(defgroup exwm-debug nil
+ "Debugging."
+ :group 'exwm)
+
+(defcustom exwm-debug-log-time-function #'exwm-debug-log-uptime
+ "Function used for generating timestamps in debug log.
+
+Here are some predefined candidates:
+`exwm-debug-log-uptime': Display the uptime of this Emacs instance.
+`exwm-debug-log-time': Display time of day.
+nil: Disable timestamp."
+ :type `(choice (const :tag "Emacs uptime" ,#'exwm-debug-log-uptime)
+ (const :tag "Time of day" ,#'exwm-debug-log-time)
+ (const :tag "Off" nil)
+ (function :tag "Other"))
+ :set (lambda (symbol value)
+ (set-default symbol value)
+ ;; Also change the format for XELB to make logs consistent
+ ;; (as they share the same buffer).
+ (setq xcb-debug:log-time-function value)))
+
+(defalias 'exwm-debug-log-uptime 'xcb-debug:log-uptime
+ "Add uptime to `exwm-debug' logs.")
+
+(defalias 'exwm-debug-log-time 'xcb-debug:log-time
+ "Add time of day to `exwm-debug' logs.")
+
+(defvar exwm--connection nil "X connection.")
+
+(defvar exwm--terminal nil
+ "Terminal corresponding to `exwm--connection'.")
+
+(defvar exwm--wmsn-window nil
+ "An X window owning the WM_S0 selection.")
+
+(defvar exwm--wmsn-acquire-timeout 3
+ "Number of seconds to wait for other window managers to release the selection.")
+
+(defvar exwm--guide-window nil
+ "An X window separating workspaces and X windows.")
+
+(defvar exwm--id-buffer-alist nil "Alist of (<X window ID> . <Emacs buffer>).")
+
+(defvar exwm--root nil "Root window.")
+
+(defvar exwm-input--global-prefix-keys)
+(defvar exwm-input--simulation-keys)
+(defvar exwm-input-line-mode-passthrough)
+(defvar exwm-input-prefix-keys)
+(defvar exwm-workspace--list)
+(declare-function exwm-input--fake-key "exwm-input.el" (event))
+(declare-function exwm-input--on-KeyPress-line-mode "exwm-input.el"
+ (key-press raw-data))
+(declare-function exwm-floating-hide "exwm-floating.el")
+(declare-function exwm-floating-toggle-floating "exwm-floating.el")
+(declare-function exwm-input-release-keyboard "exwm-input.el")
+(declare-function exwm-input-send-next-key "exwm-input.el" (times))
+(declare-function exwm-layout-set-fullscreen "exwm-layout.el" (&optional id))
+(declare-function exwm-layout-toggle-mode-line "exwm-layout.el")
+(declare-function exwm-manage--kill-buffer-query-function "exwm-manage.el")
+(declare-function exwm-workspace-move-window "exwm-workspace.el"
+ (frame-or-index &optional id))
+(declare-function exwm-workspace-switch "exwm-workspace.el"
+ (frame-or-index &optional force))
+
+(defvaralias 'exwm-debug 'exwm-debug-mode)
+(define-minor-mode exwm-debug-mode
+ "Debug-logging enabled if non-nil."
+ :global t
+ :group 'exwm-debug)
+
+(defmacro exwm--debug (&rest forms)
+ "Evaluate FORMS if `exwm-debug-mode' is active."
+ (when exwm-debug `(progn ,@forms)))
+
+(defmacro exwm--log (&optional format-string &rest objects)
+ "Emit a message prepending the name of the function being executed.
+
+FORMAT-STRING is a string specifying the message to output, as in
+`format'. The OBJECTS arguments specify the substitutions."
+ (unless format-string (setq format-string ""))
+ `(when exwm-debug
+ (xcb-debug:message ,(concat "%s%s:\t" format-string "\n")
+ (if exwm-debug-log-time-function
+ (funcall exwm-debug-log-time-function)
+ "")
+ (xcb-debug:compile-time-function-name)
+ ,@objects)
+ nil))
+
+(defsubst exwm--id->buffer (id)
+ "X window ID => Emacs buffer."
+ (declare (indent defun))
+ (cdr (assoc id exwm--id-buffer-alist)))
+
+(defsubst exwm--buffer->id (buffer)
+ "Emacs buffer BUFFER => X window ID."
+ (declare (indent defun))
+ (car (rassoc buffer exwm--id-buffer-alist)))
+
+(defun exwm--lock (&rest _args)
+ "Lock (disable all events)."
+ (exwm--log)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window exwm--root
+ :value-mask xcb:CW:EventMask
+ :event-mask xcb:EventMask:NoEvent))
+ (xcb:flush exwm--connection))
+
+(defun exwm--unlock (&rest _args)
+ "Unlock (enable all events)."
+ (exwm--log)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window exwm--root
+ :value-mask xcb:CW:EventMask
+ :event-mask (eval-when-compile
+ (logior xcb:EventMask:SubstructureRedirect
+ xcb:EventMask:StructureNotify))))
+ (xcb:flush exwm--connection))
+
+(defun exwm--set-geometry (xwin x y width height)
+ "Set the geometry of X window XWIN to WIDTHxHEIGHT+X+Y.
+
+Nil can be passed as placeholder."
+ (exwm--log "Setting #x%x to %sx%s+%s+%s" xwin width height x y)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window xwin
+ :value-mask (logior (if x xcb:ConfigWindow:X 0)
+ (if y xcb:ConfigWindow:Y 0)
+ (if width xcb:ConfigWindow:Width 0)
+ (if height xcb:ConfigWindow:Height 0))
+ :x x :y y :width width :height height)))
+
+(defun exwm--intern-atom (atom &optional conn)
+ "Intern X11 ATOM.
+If CONN is non-nil, use it instead of the value of the variable
+`exwm--connection'."
+ (slot-value (xcb:+request-unchecked+reply (or conn exwm--connection)
+ (make-instance 'xcb:InternAtom
+ :only-if-exists 0
+ :name-len (length atom)
+ :name atom))
+ 'atom))
+
+(defmacro exwm--defer (secs function &rest args)
+ "Defer the execution of FUNCTION.
+
+The action is to call FUNCTION with arguments ARGS. If Emacs is not idle,
+defer the action until Emacs is idle. Otherwise, defer the action until at
+least SECS seconds later."
+ `(run-with-idle-timer (+ (float-time (or (current-idle-time)
+ (seconds-to-time (- ,secs))))
+ ,secs)
+ nil
+ ,function
+ ,@args))
+
+(defsubst exwm--terminal-p (&optional frame)
+ "Return t when FRAME's terminal is EXWM's terminal.
+If FRAME is null, use selected frame."
+ (declare (indent defun))
+ (eq exwm--terminal (frame-terminal frame)))
+
+(defun exwm--get-client-event-mask ()
+ "Return event mask set on all managed windows."
+ (logior xcb:EventMask:StructureNotify
+ xcb:EventMask:PropertyChange
+ (if mouse-autoselect-window
+ xcb:EventMask:EnterWindow 0)))
+
+(defun exwm--color->pixel (color)
+ "Convert COLOR to PIXEL (index in TrueColor colormap)."
+ (when (and color
+ (eq (x-display-visual-class) 'true-color))
+ (let ((rgb (color-values color)))
+ (logior (ash (ash (pop rgb) -8) 16)
+ (ash (ash (pop rgb) -8) 8)
+ (ash (pop rgb) -8)))))
+
+(defun exwm--get-visual-depth-colormap (conn id)
+ "Get visual, depth and colormap from X window ID.
+Return a three element list with the respective results.
+
+If CONN is non-nil, use it instead of the value of the variable
+`exwm--connection'."
+ (let (ret-visual ret-depth ret-colormap)
+ (with-slots (visual colormap)
+ (xcb:+request-unchecked+reply conn
+ (make-instance 'xcb:GetWindowAttributes :window id))
+ (setq ret-visual visual)
+ (setq ret-colormap colormap))
+ (with-slots (depth)
+ (xcb:+request-unchecked+reply conn
+ (make-instance 'xcb:GetGeometry :drawable id))
+ (setq ret-depth depth))
+ (list ret-visual ret-depth ret-colormap)))
+
+(defun exwm--mode-name ()
+ "Mode name string used in `exwm-mode' buffers."
+ (let ((name "EXWM"))
+ (if (cl-some (lambda (i) (frame-parameter i 'exwm-urgency))
+ exwm-workspace--list)
+ (propertize name 'face 'font-lock-warning-face)
+ name)))
+
+;; Internal variables
+(defvar-local exwm--id nil) ;window ID
+(defvar-local exwm--configurations nil) ;initial configurations.
+(defvar-local exwm--frame nil) ;workspace frame
+(defvar-local exwm--floating-frame nil) ;floating frame
+(defvar-local exwm--mode-line-format nil) ;save mode-line-format
+(defvar-local exwm--floating-frame-position nil) ;set when hidden.
+(defvar-local exwm--fixed-size nil) ;fixed size
+(defvar-local exwm--selected-input-mode 'line-mode
+ "Input mode as selected by the user.
+One of `line-mode' or `char-mode'.")
+(defvar-local exwm--input-mode 'line-mode
+ "Actual input mode, i.e. whether mouse and keyboard are grabbed.")
+;; Properties
+(defvar-local exwm--desktop nil "_NET_WM_DESKTOP.")
+(defvar-local exwm-window-type nil "_NET_WM_WINDOW_TYPE.")
+(defvar-local exwm--geometry nil)
+(defvar-local exwm-class-name nil "Class name in WM_CLASS.")
+(defvar-local exwm-instance-name nil "Instance name in WM_CLASS.")
+(defvar-local exwm-title nil "Window title (either _NET_WM_NAME or WM_NAME).")
+(defvar-local exwm--title-is-utf8 nil)
+(defvar-local exwm-transient-for nil "WM_TRANSIENT_FOR.")
+(defvar-local exwm--protocols nil)
+(defvar-local exwm-state xcb:icccm:WM_STATE:NormalState "WM_STATE.")
+(defvar-local exwm--ewmh-state nil "_NET_WM_STATE.")
+;; _NET_WM_NORMAL_HINTS
+(defvar-local exwm--normal-hints-x nil)
+(defvar-local exwm--normal-hints-y nil)
+(defvar-local exwm--normal-hints-width nil)
+(defvar-local exwm--normal-hints-height nil)
+(defvar-local exwm--normal-hints-min-width nil)
+(defvar-local exwm--normal-hints-min-height nil)
+(defvar-local exwm--normal-hints-max-width nil)
+(defvar-local exwm--normal-hints-max-height nil)
+;; (defvar-local exwm--normal-hints-win-gravity nil)
+;; WM_HINTS
+(defvar-local exwm--hints-input nil)
+(defvar-local exwm--hints-urgency nil)
+;; _MOTIF_WM_HINTS
+(defvar-local exwm--mwm-hints-decorations t)
+
+(defvar-keymap exwm-mode-map
+ :doc "Keymap for `exwm-mode'."
+ "C-c C-d C-l" #'xcb-debug:clear
+ "C-c C-d C-m" #'xcb-debug:mark
+ "C-c C-d C-t" #'exwm-debug-mode
+ "C-c C-f" #'exwm-layout-set-fullscreen
+ "C-c C-h" #'exwm-floating-hide
+ "C-c C-k" #'exwm-input-release-keyboard
+ "C-c C-m" #'exwm-workspace-move-window
+ "C-c C-q" #'exwm-input-send-next-key
+ "C-c C-t C-f" #'exwm-floating-toggle-floating
+ "C-c C-t C-m" #'exwm-layout-toggle-mode-line)
+
+(defun exwm--kmacro-self-insert-command ()
+ "The EXWM kmacro equivalent of `self-insert-command'."
+ (interactive)
+ (cond
+ ((or exwm-input-line-mode-passthrough
+ (active-minibuffer-window)
+ (memq last-input-event exwm-input--global-prefix-keys)
+ (memq last-input-event exwm-input-prefix-keys)
+ (lookup-key exwm-mode-map (vector last-input-event))
+ (gethash last-input-event exwm-input--simulation-keys))
+ (set-transient-map (make-composed-keymap (list exwm-mode-map global-map)))
+ (push last-input-event unread-command-events))
+ (t
+ (exwm-input--fake-key last-input-event))))
+(put 'exwm--kmacro-self-insert-command 'completion-predicate #'ignore)
+
+(defvar-keymap exwm--kmacro-map
+ :doc "Keymap used when executing keyboard macros."
+ "<t>" #'exwm--kmacro-self-insert-command)
+
+;; This menu mainly acts as an reminder for users. Thus it should be as
+;; detailed as possible, even some entries do not make much sense here.
+;; Also, inactive entries should be disabled rather than hidden.
+(easy-menu-define exwm-mode-menu exwm-mode-map
+ "Menu for `exwm-mode'."
+ `("EXWM"
+ "---"
+ "*General*"
+ "---"
+ ["Toggle floating" exwm-floating-toggle-floating]
+ ["Toggle fullscreen mode" exwm-layout-toggle-fullscreen]
+ ["Hide window" exwm-floating-hide exwm--floating-frame]
+ ["Close window" (kill-buffer (current-buffer))]
+
+ "---"
+ "*Resizing*"
+ "---"
+ ["Toggle mode-line" exwm-layout-toggle-mode-line]
+ ["Enlarge window vertically" exwm-layout-enlarge-window]
+ ["Enlarge window horizontally" exwm-layout-enlarge-window-horizontally]
+ ["Shrink window vertically" exwm-layout-shrink-window]
+ ["Shrink window horizontally" exwm-layout-shrink-window-horizontally]
+
+ "---"
+ "*Keyboard*"
+ "---"
+ ["Toggle keyboard mode" exwm-input-toggle-keyboard]
+ ["Send key" exwm-input-send-next-key (eq exwm--input-mode 'line-mode)]
+ ;; This is merely a reference.
+ ("Send simulation key" :filter
+ ,(lambda (&rest _args)
+ (let (result)
+ (maphash
+ (lambda (key value)
+ (when (sequencep key)
+ (setq result (append result
+ `([,(format "Send '%s'"
+ (key-description value))
+ ,(lambda ()
+ (interactive)
+ (mapc #'exwm-input--fake-key value))
+ :keys ,(key-description key)])))))
+ exwm-input--simulation-keys)
+ result)))
+
+ ["Define global binding" exwm-input-set-key]
+
+ "---"
+ "*Workspace*"
+ "---"
+ ["Add workspace" exwm-workspace-add]
+ ["Delete current workspace" exwm-workspace-delete]
+ ["Move workspace to" exwm-workspace-move]
+ ["Swap workspaces" exwm-workspace-swap]
+ ["Move X window to" exwm-workspace-move-window]
+ ["Move X window from" exwm-workspace-switch-to-buffer]
+ ["Toggle minibuffer" exwm-workspace-toggle-minibuffer]
+ ["Switch workspace" exwm-workspace-switch]
+ ;; Place this entry at bottom to avoid selecting others by accident.
+ ("Switch to" :filter
+ ,(lambda (&rest _args)
+ (mapcar (lambda (i)
+ `[,(format "Workspace %d" i)
+ ,(lambda ()
+ (interactive)
+ (exwm-workspace-switch i))
+ (/= ,i exwm-workspace-current-index)])
+ (number-sequence 0 (1- (length exwm-workspace--list))))))))
+
+(define-derived-mode exwm-mode nil "EXWM"
+ "Major mode for managing X windows.
+
+\\{exwm-mode-map}"
+ :interactive nil :abbrev-table nil :syntax-table nil
+ ;; Change major-mode is not allowed
+ (add-hook 'change-major-mode-hook #'kill-buffer nil t)
+ ;; Kill buffer -> close window
+ (add-hook 'kill-buffer-query-functions
+ #'exwm-manage--kill-buffer-query-function nil t)
+ ;; Redirect events when executing keyboard macros.
+ (push `(executing-kbd-macro . ,exwm--kmacro-map)
+ minor-mode-overriding-map-alist)
+ (make-local-variable 'mode-line-position)
+ (setq mode-name '(:eval (exwm--mode-name))
+ buffer-read-only t
+ cursor-type nil
+ left-margin-width nil
+ right-margin-width nil
+ left-fringe-width 0
+ right-fringe-width 0
+ vertical-scroll-bar nil
+ eldoc-documentation-functions nil
+ mode-line-position nil
+ mode-line-modified nil
+ mode-line-mule-info nil
+ mode-line-remote nil))
+
+(defmacro exwm--global-minor-mode-body (name &optional init exit)
+ "Global minor mode body for mode with NAME.
+The INIT and EXIT functions are added to `exwm-init-hook' and
+`exwm-exit-hook' respectively. If an X connection exists, the mode is
+immediately enabled or disabled."
+ (declare (indent 1) (debug t))
+ (let* ((mode (intern (format "exwm-%s-mode" name)))
+ (init (or init (intern (format "exwm-%s--init" name))))
+ (exit (or exit (intern (format "exwm-%s--exit" name)))))
+ `(progn
+ (exwm--log)
+ (cond
+ (,mode
+ (add-hook 'exwm-init-hook #',init)
+ (add-hook 'exwm-exit-hook #',exit)
+ (when exwm--connection (,init)))
+ (t
+ (remove-hook 'exwm-init-hook #',init)
+ (remove-hook 'exwm-exit-hook #',exit)
+ (when exwm--connection (,exit)))))))
+
+(provide 'exwm-core)
+;;; exwm-core.el ends here
diff --git a/elpa/exwm-0.33/exwm-core.elc b/elpa/exwm-0.33/exwm-core.elc
new file mode 100644
index 0000000..550734d
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-core.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-floating.el b/elpa/exwm-0.33/exwm-floating.el
new file mode 100644
index 0000000..c0271fd
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-floating.el
@@ -0,0 +1,793 @@
+;;; exwm-floating.el --- Floating Module for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 module deals with the conversion between floating and non-floating
+;; states and implements moving/resizing operations on floating windows.
+
+;;; Code:
+
+(require 'xcb-cursor)
+(require 'exwm-core)
+
+(defgroup exwm-floating nil
+ "Floating."
+ :group 'exwm)
+
+(defcustom exwm-floating-setup-hook nil
+ "Normal hook run when an X window has been made floating.
+This hook runs in the context of the corresponding buffer."
+ :type 'hook)
+
+(defcustom exwm-floating-exit-hook nil
+ "Normal hook run when an X window has exited floating state.
+This hook runs in the context of the corresponding buffer."
+ :type 'hook)
+
+(defcustom exwm-floating-border-color "navy"
+ "Border color of floating windows."
+ :type 'color
+ :initialize #'custom-initialize-default
+ :set (lambda (symbol value)
+ (set-default symbol value)
+ ;; Change border color for all floating X windows.
+ (when exwm--connection
+ (let ((border-pixel (exwm--color->pixel value)))
+ (when border-pixel
+ (dolist (pair exwm--id-buffer-alist)
+ (with-current-buffer (cdr pair)
+ (when exwm--floating-frame
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window
+ (frame-parameter exwm--floating-frame
+ 'exwm-container)
+ :value-mask xcb:CW:BorderPixel
+ :border-pixel border-pixel)))))
+ (xcb:flush exwm--connection))))))
+
+(defcustom exwm-floating-border-width 1
+ "Border width of floating windows."
+ :type `(integer
+ :validate ,(lambda (widget)
+ (when (< (widget-value widget) 0)
+ (widget-put widget :error "Border width is at least 0")
+ widget)))
+ :initialize #'custom-initialize-default
+ :set (lambda (symbol value)
+ (let ((delta (- value exwm-floating-border-width))
+ container)
+ (set-default symbol value)
+ ;; Change border width for all floating X windows.
+ (dolist (pair exwm--id-buffer-alist)
+ (with-current-buffer (cdr pair)
+ (when exwm--floating-frame
+ (setq container (frame-parameter exwm--floating-frame
+ 'exwm-container))
+ (with-slots (x y)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry
+ :drawable container))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window container
+ :value-mask
+ (logior xcb:ConfigWindow:X
+ xcb:ConfigWindow:Y
+ xcb:ConfigWindow:BorderWidth)
+ :border-width value
+ :x (- x delta)
+ :y (- y delta)))))))
+ (when exwm--connection
+ (xcb:flush exwm--connection)))))
+
+;; Cursors for moving/resizing a window
+(defvar exwm-floating--cursor-move nil)
+(defvar exwm-floating--cursor-top-left nil)
+(defvar exwm-floating--cursor-top nil)
+(defvar exwm-floating--cursor-top-right nil)
+(defvar exwm-floating--cursor-right nil)
+(defvar exwm-floating--cursor-bottom-right nil)
+(defvar exwm-floating--cursor-bottom nil)
+(defvar exwm-floating--cursor-bottom-left nil)
+(defvar exwm-floating--cursor-left nil)
+
+(defvar exwm-floating--moveresize-calculate nil
+ "Calculate move/resize parameters [buffer event-mask x y width height].")
+
+(defvar exwm-workspace--current)
+(defvar exwm-workspace--frame-y-offset)
+(defvar exwm-workspace--window-y-offset)
+(declare-function exwm-layout--hide "exwm-layout.el" (id))
+(declare-function exwm-layout--iconic-state-p "exwm-layout.el" (&optional id))
+(declare-function exwm-layout--refresh "exwm-layout.el" ())
+(declare-function exwm-layout--show "exwm-layout.el" (id &optional window))
+(declare-function exwm-workspace--position "exwm-workspace.el" (frame))
+(declare-function exwm-workspace--update-offsets "exwm-workspace.el" ())
+(declare-function exwm-workspace--workarea "exwm-workspace.el" (frame))
+
+(defun exwm-floating--set-allowed-actions (id tiled-p)
+ "Set _NET_WM_ALLOWED_ACTIONS for window with ID.
+If TILED-P is non-nil, set actions for tiled window."
+ (exwm--log "#x%x" id)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_ALLOWED_ACTIONS
+ :window id
+ :data (if tiled-p
+ (vector xcb:Atom:_NET_WM_ACTION_MINIMIZE
+ xcb:Atom:_NET_WM_ACTION_FULLSCREEN
+ xcb:Atom:_NET_WM_ACTION_CHANGE_DESKTOP
+ xcb:Atom:_NET_WM_ACTION_CLOSE)
+ (vector xcb:Atom:_NET_WM_ACTION_MOVE
+ xcb:Atom:_NET_WM_ACTION_RESIZE
+ xcb:Atom:_NET_WM_ACTION_MINIMIZE
+ xcb:Atom:_NET_WM_ACTION_FULLSCREEN
+ xcb:Atom:_NET_WM_ACTION_CHANGE_DESKTOP
+ xcb:Atom:_NET_WM_ACTION_CLOSE)))))
+
+(defun exwm-floating--set-floating (id)
+ "Make window ID floating."
+ (let ((window (get-buffer-window (exwm--id->buffer id))))
+ (when window
+ ;; Hide the non-floating X window first.
+ (set-window-buffer window (other-buffer nil t))))
+ (let* ((original-frame (buffer-local-value 'exwm--frame
+ (exwm--id->buffer id)))
+ ;; Create new frame
+ (frame (with-current-buffer
+ (or (get-buffer "*scratch*")
+ (progn
+ (set-buffer-major-mode
+ (get-buffer-create "*scratch*"))
+ (get-buffer "*scratch*")))
+ (make-frame
+ `((minibuffer . ,(minibuffer-window exwm--frame))
+ (tab-bar-lines . 0)
+ (tab-bar-lines-keep-state . t)
+ (left . ,(* window-min-width -10000))
+ (top . ,(* window-min-height -10000))
+ (width . ,window-min-width)
+ (height . ,window-min-height)
+ (unsplittable . t))))) ;and fix the size later
+ (outer-id (string-to-number (frame-parameter frame 'outer-window-id)))
+ (window-id (string-to-number (frame-parameter frame 'window-id)))
+ (frame-container (xcb:generate-id exwm--connection))
+ (window (frame-first-window frame)) ;and it's the only window
+ (x (slot-value exwm--geometry 'x))
+ (y (slot-value exwm--geometry 'y))
+ (width (slot-value exwm--geometry 'width))
+ (height (slot-value exwm--geometry 'height)))
+ ;; Force drawing menu-bar & tool-bar.
+ (redisplay t)
+ (exwm-workspace--update-offsets)
+ (exwm--log "Floating geometry (original): %dx%d%+d%+d" width height x y)
+ ;; Save frame parameters.
+ (set-frame-parameter frame 'exwm-outer-id outer-id)
+ (set-frame-parameter frame 'exwm-id window-id)
+ (set-frame-parameter frame 'exwm-container frame-container)
+ ;; Fix illegal parameters
+ ;; FIXME: check normal hints restrictions
+ (with-slots ((x* x) (y* y) (width* width) (height* height))
+ (exwm-workspace--workarea original-frame)
+ ;; Center floating windows
+ (when (and (or (= x 0) (= x x*))
+ (or (= y 0) (= y y*)))
+ (let ((buffer (exwm--id->buffer exwm-transient-for))
+ window edges)
+ (when (and buffer (setq window (get-buffer-window buffer)))
+ (setq edges (window-inside-absolute-pixel-edges window))
+ (unless (and (<= width (- (elt edges 2) (elt edges 0)))
+ (<= height (- (elt edges 3) (elt edges 1))))
+ (setq edges nil)))
+ (if edges
+ ;; Put at the center of leading window
+ (setq x (+ x* (/ (- (elt edges 2) (elt edges 0) width) 2))
+ y (+ y* (/ (- (elt edges 3) (elt edges 1) height) 2)))
+ ;; Put at the center of screen
+ (setq x (/ (- width* width) 2)
+ y (/ (- height* height) 2)))))
+ (if (> width width*)
+ ;; Too wide
+ (progn (setq x x*
+ width width*))
+ ;; Invalid width
+ (when (= 0 width) (setq width (/ width* 2)))
+ ;; Make sure at least half of the window is visible
+ (unless (< x* (+ x (/ width 2)) (+ x* width*))
+ (setq x (+ x* (/ (- width* width) 2)))))
+ (if (> height height*)
+ ;; Too tall
+ (setq y y*
+ height height*)
+ ;; Invalid height
+ (when (= 0 height) (setq height (/ height* 2)))
+ ;; Make sure at least half of the window is visible
+ (unless (< y* (+ y (/ height 2)) (+ y* height*))
+ (setq y (+ y* (/ (- height* height) 2)))))
+ ;; The geometry can be overridden by user options.
+ (let ((x** (plist-get exwm--configurations 'x))
+ (y** (plist-get exwm--configurations 'y))
+ (width** (plist-get exwm--configurations 'width))
+ (height** (plist-get exwm--configurations 'height)))
+ (if (integerp x**)
+ (setq x (+ x* x**))
+ (when (and (floatp x**)
+ (>= 1 x** 0))
+ (setq x (+ x* (round (* x** width*))))))
+ (if (integerp y**)
+ (setq y (+ y* y**))
+ (when (and (floatp y**)
+ (>= 1 y** 0))
+ (setq y (+ y* (round (* y** height*))))))
+ (if (integerp width**)
+ (setq width width**)
+ (when (and (floatp width**)
+ (> 1 width** 0))
+ (setq width (max 1 (round (* width** width*))))))
+ (if (integerp height**)
+ (setq height height**)
+ (when (and (floatp height**)
+ (> 1 height** 0))
+ (setq height (max 1 (round (* height** height*))))))))
+ (exwm--set-geometry id x y nil nil)
+ (xcb:flush exwm--connection)
+ (exwm--log "Floating geometry (corrected): %dx%d%+d%+d" width height x y)
+ ;; Fit frame to client
+ ;; It seems we have to make the frame invisible in order to resize it
+ ;; timely.
+ ;; The frame will be made visible by `select-frame-set-input-focus'.
+ (make-frame-invisible frame)
+ (let* ((edges (window-inside-pixel-edges window))
+ (frame-width (+ width (- (frame-pixel-width frame)
+ (- (elt edges 2) (elt edges 0)))))
+ (frame-height (+ height (- (frame-pixel-height frame)
+ (- (elt edges 3) (elt edges 1)))
+ ;; Use `frame-outer-height' in the future.
+ exwm-workspace--frame-y-offset))
+ (floating-mode-line (plist-get exwm--configurations
+ 'floating-mode-line))
+ (floating-header-line (plist-get exwm--configurations
+ 'floating-header-line))
+ (border-pixel (exwm--color->pixel exwm-floating-border-color)))
+ (if floating-mode-line
+ (setq exwm--mode-line-format (or exwm--mode-line-format
+ mode-line-format)
+ mode-line-format floating-mode-line)
+ (if (and (not (plist-member exwm--configurations 'floating-mode-line))
+ exwm--mwm-hints-decorations)
+ (when exwm--mode-line-format
+ (setq mode-line-format exwm--mode-line-format))
+ ;; The mode-line need to be hidden in floating mode.
+ (setq frame-height (- frame-height (window-mode-line-height
+ (frame-root-window frame)))
+ exwm--mode-line-format (or exwm--mode-line-format
+ mode-line-format)
+ mode-line-format nil)))
+ (if floating-header-line
+ (setq header-line-format floating-header-line)
+ (if (and (not (plist-member exwm--configurations
+ 'floating-header-line))
+ exwm--mwm-hints-decorations)
+ (setq header-line-format nil)
+ ;; The header-line need to be hidden in floating mode.
+ (setq frame-height (- frame-height (window-header-line-height
+ (frame-root-window frame)))
+ header-line-format nil)))
+ (set-frame-size frame frame-width frame-height t)
+ ;; Create the frame container as the parent of the frame.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:CreateWindow
+ :depth 0
+ :wid frame-container
+ :parent exwm--root
+ :x x
+ :y (- y exwm-workspace--window-y-offset)
+ :width width
+ :height height
+ :border-width
+ (with-current-buffer (exwm--id->buffer id)
+ (let ((border-witdh (plist-get exwm--configurations
+ 'border-width)))
+ (if (and (integerp border-witdh)
+ (>= border-witdh 0))
+ border-witdh
+ exwm-floating-border-width)))
+ :class xcb:WindowClass:InputOutput
+ :visual 0
+ :value-mask (logior xcb:CW:BackPixmap
+ (if border-pixel
+ xcb:CW:BorderPixel 0)
+ xcb:CW:OverrideRedirect)
+ :background-pixmap xcb:BackPixmap:ParentRelative
+ :border-pixel border-pixel
+ :override-redirect 1))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window frame-container
+ :data
+ (format "EXWM floating frame container for 0x%x" id)))
+ ;; Map it.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:MapWindow :window frame-container))
+ ;; Put the X window right above this frame container.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window id
+ :value-mask (logior xcb:ConfigWindow:Sibling
+ xcb:ConfigWindow:StackMode)
+ :sibling frame-container
+ :stack-mode xcb:StackMode:Above)))
+ ;; Reparent this frame to its container.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window outer-id :parent frame-container :x 0 :y 0))
+ (exwm-floating--set-allowed-actions id nil)
+ (xcb:flush exwm--connection)
+ ;; Set window/buffer
+ (with-current-buffer (exwm--id->buffer id)
+ (setq window-size-fixed exwm--fixed-size
+ exwm--floating-frame frame)
+ ;; Do the refresh manually.
+ (remove-hook 'window-configuration-change-hook #'exwm-layout--refresh)
+ (set-window-buffer window (current-buffer)) ;this changes current buffer
+ (add-hook 'window-configuration-change-hook #'exwm-layout--refresh)
+ (set-window-dedicated-p window t)
+ (set-window-parameter window 'split-window
+ (lambda (&rest _) (user-error "Floating window cannot be split")))
+ (exwm-layout--show id window))
+ (with-current-buffer (exwm--id->buffer id)
+ (if (exwm-layout--iconic-state-p id)
+ ;; Hide iconic floating X windows.
+ (exwm-floating-hide)
+ (with-selected-frame exwm--frame
+ (exwm-layout--refresh)))
+ (select-frame-set-input-focus frame))
+ ;; FIXME: Strangely, the Emacs frame can move itself at this point
+ ;; when there are left/top struts set. Force resetting its
+ ;; position seems working, but it'd better to figure out why.
+ ;; FIXME: This also happens in another case (#220) where the cause is
+ ;; still unclear.
+ (exwm--set-geometry outer-id 0 0 nil nil)
+ (xcb:flush exwm--connection))
+ (with-current-buffer (exwm--id->buffer id)
+ (run-hooks 'exwm-floating-setup-hook))
+ ;; Redraw the frame.
+ (redisplay t))
+
+(defun exwm-floating--unset-floating (id)
+ "Make window ID non-floating."
+ (exwm--log "#x%x" id)
+ (let ((buffer (exwm--id->buffer id)))
+ (with-current-buffer buffer
+ (when exwm--floating-frame
+ ;; The X window is already mapped.
+ ;; Unmap the X window.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window id :value-mask xcb:CW:EventMask
+ :event-mask xcb:EventMask:NoEvent))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UnmapWindow :window id))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window id :value-mask xcb:CW:EventMask
+ :event-mask (exwm--get-client-event-mask)))
+ ;; Reparent the floating frame back to the root window.
+ (let ((frame-id (frame-parameter exwm--floating-frame 'exwm-outer-id))
+ (frame-container (frame-parameter exwm--floating-frame
+ 'exwm-container)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UnmapWindow :window frame-id))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window frame-id
+ :parent exwm--root
+ :x 0 :y 0))
+ ;; Also destroy its container.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:DestroyWindow :window frame-container))))
+ ;; Place the X window just above the reference X window.
+ ;; (the stacking order won't change from now on).
+ ;; Also hide the possible floating border.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window id
+ :value-mask (logior xcb:ConfigWindow:BorderWidth
+ xcb:ConfigWindow:Sibling
+ xcb:ConfigWindow:StackMode)
+ :border-width 0
+ :sibling exwm--guide-window
+ :stack-mode xcb:StackMode:Above)))
+ (exwm-floating--set-allowed-actions id t)
+ (xcb:flush exwm--connection)
+ (with-current-buffer buffer
+ (when exwm--floating-frame ;from floating to non-floating
+ (set-window-dedicated-p (frame-first-window exwm--floating-frame) nil)
+ ;; Select a tiling window and delete the old frame.
+ (select-window (frame-selected-window exwm-workspace--current))
+ (with-current-buffer buffer
+ (delete-frame exwm--floating-frame))))
+ (with-current-buffer buffer
+ (setq window-size-fixed nil
+ exwm--floating-frame nil)
+ (if (not (plist-member exwm--configurations 'tiling-mode-line))
+ (when exwm--mode-line-format
+ (setq mode-line-format exwm--mode-line-format))
+ (setq exwm--mode-line-format (or exwm--mode-line-format
+ mode-line-format)
+ mode-line-format (plist-get exwm--configurations
+ 'tiling-mode-line)))
+ (if (not (plist-member exwm--configurations 'tiling-header-line))
+ (setq header-line-format nil)
+ (setq header-line-format (plist-get exwm--configurations
+ 'tiling-header-line))))
+ ;; Only show X windows in normal state.
+ (unless (exwm-layout--iconic-state-p)
+ (pop-to-buffer-same-window buffer)))
+ (with-current-buffer (exwm--id->buffer id)
+ (run-hooks 'exwm-floating-exit-hook)))
+
+;;;###autoload
+(cl-defun exwm-floating-toggle-floating ()
+ "Toggle the current window between floating and non-floating states."
+ (interactive)
+ (exwm--log)
+ (unless (derived-mode-p 'exwm-mode)
+ (cl-return-from exwm-floating-toggle-floating))
+ (with-current-buffer (window-buffer)
+ (if exwm--floating-frame
+ (exwm-floating--unset-floating exwm--id)
+ (exwm-floating--set-floating exwm--id))))
+
+;;;###autoload
+(defun exwm-floating-hide ()
+ "Hide the current floating X window (which would show again when selected)."
+ (interactive)
+ (exwm--log)
+ (when (and (derived-mode-p 'exwm-mode)
+ exwm--floating-frame)
+ (exwm-layout--hide exwm--id)
+ (select-frame-set-input-focus exwm-workspace--current)))
+
+(defun exwm-floating--start-moveresize (id &optional type)
+ "Start move/resize for window with ID.
+When non-nil, TYPE indicates the type of move/resize.
+Float resizing is stopped when TYPE is nil."
+ (exwm--log "#x%x" id)
+ (let ((buffer-or-id (or (exwm--id->buffer id) id))
+ frame container-or-id x y width height cursor)
+ (if (bufferp buffer-or-id)
+ ;; Managed.
+ (with-current-buffer buffer-or-id
+ (setq frame exwm--floating-frame
+ container-or-id (frame-parameter exwm--floating-frame
+ 'exwm-container)))
+ ;; Unmanaged.
+ (setq container-or-id id))
+ (when (and container-or-id
+ ;; Test if the pointer can be grabbed
+ (= xcb:GrabStatus:Success
+ (slot-value
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GrabPointer
+ :owner-events 0
+ :grab-window container-or-id
+ :event-mask xcb:EventMask:NoEvent
+ :pointer-mode xcb:GrabMode:Async
+ :keyboard-mode xcb:GrabMode:Async
+ :confine-to xcb:Window:None
+ :cursor xcb:Cursor:None
+ :time xcb:Time:CurrentTime))
+ 'status)))
+ (with-slots (root-x root-y win-x win-y)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:QueryPointer :window id))
+ (if (not (bufferp buffer-or-id))
+ ;; Unmanaged.
+ (unless (eq type xcb:ewmh:_NET_WM_MOVERESIZE_MOVE)
+ (with-slots ((width* width)
+ (height* height))
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry :drawable id))
+ (setq width width*
+ height height*)))
+ ;; Managed.
+ (select-window (frame-first-window frame)) ;transfer input focus
+ (setq width (frame-pixel-width frame)
+ height (frame-pixel-height frame))
+ (unless type
+ ;; Determine the resize type according to the pointer position
+ ;; Clicking the center 1/3 part to resize has no effect
+ (setq x (/ (* 3 win-x) (float width))
+ y (/ (* 3 win-y) (float height))
+ type (cond ((and (< x 1) (< y 1))
+ xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOPLEFT)
+ ((and (> x 2) (< y 1))
+ xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOPRIGHT)
+ ((and (> x 2) (> y 2))
+ xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT)
+ ((and (< x 1) (> y 2))
+ xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT)
+ ((> x 2) xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_RIGHT)
+ ((> y 2) xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOM)
+ ((< x 1) xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_LEFT)
+ ((< y 1) xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOP)))))
+ (if (not type)
+ (exwm-floating--stop-moveresize)
+ (cond ((= type xcb:ewmh:_NET_WM_MOVERESIZE_MOVE)
+ (setq cursor exwm-floating--cursor-move
+ exwm-floating--moveresize-calculate
+ (lambda (x y)
+ (vector buffer-or-id
+ (eval-when-compile
+ (logior xcb:ConfigWindow:X
+ xcb:ConfigWindow:Y))
+ (- x win-x) (- y win-y) 0 0))))
+ ((= type xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOPLEFT)
+ (setq cursor exwm-floating--cursor-top-left
+ exwm-floating--moveresize-calculate
+ (lambda (x y)
+ (vector buffer-or-id
+ (eval-when-compile
+ (logior xcb:ConfigWindow:X
+ xcb:ConfigWindow:Y
+ xcb:ConfigWindow:Width
+ xcb:ConfigWindow:Height))
+ (- x win-x) (- y win-y)
+ (- (+ root-x width) x)
+ (- (+ root-y height) y)))))
+ ((= type xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOP)
+ (setq cursor exwm-floating--cursor-top
+ exwm-floating--moveresize-calculate
+ (lambda (_x y)
+ (vector buffer-or-id
+ (eval-when-compile
+ (logior xcb:ConfigWindow:Y
+ xcb:ConfigWindow:Height))
+ 0 (- y win-y) 0 (- (+ root-y height) y)))))
+ ((= type xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOPRIGHT)
+ (setq cursor exwm-floating--cursor-top-right
+ exwm-floating--moveresize-calculate
+ (lambda (x y)
+ (vector buffer-or-id
+ (eval-when-compile
+ (logior xcb:ConfigWindow:Y
+ xcb:ConfigWindow:Width
+ xcb:ConfigWindow:Height))
+ 0 (- y win-y) (- x (- root-x width))
+ (- (+ root-y height) y)))))
+ ((= type xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_RIGHT)
+ (setq cursor exwm-floating--cursor-right
+ exwm-floating--moveresize-calculate
+ (lambda (x _y)
+ (vector buffer-or-id
+ xcb:ConfigWindow:Width
+ 0 0 (- x (- root-x width)) 0))))
+ ((= type xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT)
+ (setq cursor exwm-floating--cursor-bottom-right
+ exwm-floating--moveresize-calculate
+ (lambda (x y)
+ (vector buffer-or-id
+ (eval-when-compile
+ (logior xcb:ConfigWindow:Width
+ xcb:ConfigWindow:Height))
+ 0 0 (- x (- root-x width))
+ (- y (- root-y height))))))
+ ((= type xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOM)
+ (setq cursor exwm-floating--cursor-bottom
+ exwm-floating--moveresize-calculate
+ (lambda (_x y)
+ (vector buffer-or-id
+ xcb:ConfigWindow:Height
+ 0 0 0 (- y (- root-y height))))))
+ ((= type xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT)
+ (setq cursor exwm-floating--cursor-bottom-left
+ exwm-floating--moveresize-calculate
+ (lambda (x y)
+ (vector buffer-or-id
+ (eval-when-compile
+ (logior xcb:ConfigWindow:X
+ xcb:ConfigWindow:Width
+ xcb:ConfigWindow:Height))
+ (- x win-x)
+ 0
+ (- (+ root-x width) x)
+ (- y (- root-y height))))))
+ ((= type xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_LEFT)
+ (setq cursor exwm-floating--cursor-left
+ exwm-floating--moveresize-calculate
+ (lambda (x _y)
+ (vector buffer-or-id
+ (eval-when-compile
+ (logior xcb:ConfigWindow:X
+ xcb:ConfigWindow:Width))
+ (- x win-x) 0 (- (+ root-x width) x) 0)))))
+ ;; Select events and change cursor (should always succeed)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GrabPointer
+ :owner-events 0 :grab-window container-or-id
+ :event-mask (eval-when-compile
+ (logior xcb:EventMask:ButtonRelease
+ xcb:EventMask:ButtonMotion))
+ :pointer-mode xcb:GrabMode:Async
+ :keyboard-mode xcb:GrabMode:Async
+ :confine-to xcb:Window:None
+ :cursor cursor
+ :time xcb:Time:CurrentTime)))))))
+
+(defun exwm-floating--stop-moveresize (&rest _args)
+ "Stop move/resize."
+ (exwm--log)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UngrabPointer :time xcb:Time:CurrentTime))
+ (when exwm-floating--moveresize-calculate
+ (let (result buffer-or-id outer-id container-id)
+ (setq result (funcall exwm-floating--moveresize-calculate 0 0)
+ buffer-or-id (aref result 0))
+ (when (bufferp buffer-or-id)
+ (with-current-buffer buffer-or-id
+ (setq outer-id (frame-parameter exwm--floating-frame 'exwm-outer-id)
+ container-id (frame-parameter exwm--floating-frame
+ 'exwm-container))
+ (with-slots (x y width height border-width)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry
+ :drawable container-id))
+ ;; Notify Emacs frame about this the position change.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination outer-id
+ :event-mask xcb:EventMask:StructureNotify
+ :event
+ (xcb:marshal
+ (make-instance 'xcb:ConfigureNotify
+ :event outer-id
+ :window outer-id
+ :above-sibling xcb:Window:None
+ :x (+ x border-width)
+ :y (+ y border-width)
+ :width width
+ :height height
+ :border-width 0
+ :override-redirect 0)
+ exwm--connection)))
+ (xcb:flush exwm--connection))
+ (exwm-layout--show exwm--id
+ (frame-root-window exwm--floating-frame)))))
+ (setq exwm-floating--moveresize-calculate nil)))
+
+(defun exwm-floating--do-moveresize (data _synthetic)
+ "Perform move/resize on floating window with DATA."
+ (when exwm-floating--moveresize-calculate
+ (let* ((obj (make-instance 'xcb:MotionNotify))
+ result value-mask x y width height buffer-or-id container-or-id)
+ (xcb:unmarshal obj data)
+ (setq result (funcall exwm-floating--moveresize-calculate
+ (slot-value obj 'root-x) (slot-value obj 'root-y))
+ buffer-or-id (aref result 0)
+ value-mask (aref result 1)
+ x (aref result 2)
+ y (aref result 3)
+ width (max 1 (aref result 4))
+ height (max 1 (aref result 5)))
+ (if (not (bufferp buffer-or-id))
+ ;; Unmanaged.
+ (setq container-or-id buffer-or-id)
+ ;; Managed.
+ (setq container-or-id
+ (with-current-buffer buffer-or-id
+ (frame-parameter exwm--floating-frame 'exwm-container))
+ x (- x exwm-floating-border-width)
+ ;; Use `frame-outer-height' in the future.
+ y (- y exwm-floating-border-width
+ exwm-workspace--window-y-offset)
+ height (+ height exwm-workspace--window-y-offset)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window container-or-id
+ :value-mask (aref result 1)
+ :x x
+ :y y
+ :width width
+ :height height))
+ (when (bufferp buffer-or-id)
+ ;; Managed.
+ (with-current-buffer buffer-or-id
+ (let ((resize-value-mask
+ (logand value-mask (logior xcb:ConfigWindow:Width
+ xcb:ConfigWindow:Height)))
+ (move-value-mask
+ (logand value-mask (logior xcb:ConfigWindow:X
+ xcb:ConfigWindow:Y))))
+ (when (/= 0 resize-value-mask)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm--floating-frame
+ 'exwm-outer-id)
+ :value-mask resize-value-mask
+ :width width
+ :height height)))
+ (when (/= 0 move-value-mask)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window exwm--id
+ :value-mask move-value-mask
+ :x (+ x exwm-floating-border-width)
+ :y (+ y exwm-floating-border-width)))))))
+ (xcb:flush exwm--connection))))
+
+(defun exwm-floating-move (&optional delta-x delta-y)
+ "Move a floating window right by DELTA-X pixels and down by DELTA-Y pixels.
+
+Both DELTA-X and DELTA-Y default to 1. This command should be bound locally."
+ (exwm--log "delta-x: %s, delta-y: %s" delta-x delta-y)
+ (unless (and (derived-mode-p 'exwm-mode) exwm--floating-frame)
+ (user-error "[EXWM] `exwm-floating-move' is only for floating X windows"))
+ (unless delta-x (setq delta-x 1))
+ (unless delta-y (setq delta-y 1))
+ (unless (and (= 0 delta-x) (= 0 delta-y))
+ (let* ((floating-container (frame-parameter exwm--floating-frame
+ 'exwm-container))
+ (geometry (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry
+ :drawable floating-container)))
+ (edges (window-inside-absolute-pixel-edges)))
+ (with-slots (x y) geometry
+ (exwm--set-geometry floating-container
+ (+ x delta-x) (+ y delta-y) nil nil))
+ (exwm--set-geometry exwm--id
+ (+ (pop edges) delta-x)
+ (+ (pop edges) delta-y)
+ nil nil))
+ (xcb:flush exwm--connection)))
+
+(defun exwm-floating--init ()
+ "Initialize floating module."
+ (exwm--log)
+ ;; Initialize cursors for moving/resizing a window
+ (xcb:cursor:init exwm--connection)
+ (setq exwm-floating--cursor-move
+ (xcb:cursor:load-cursor exwm--connection "fleur")
+ exwm-floating--cursor-top-left
+ (xcb:cursor:load-cursor exwm--connection "top_left_corner")
+ exwm-floating--cursor-top
+ (xcb:cursor:load-cursor exwm--connection "top_side")
+ exwm-floating--cursor-top-right
+ (xcb:cursor:load-cursor exwm--connection "top_right_corner")
+ exwm-floating--cursor-right
+ (xcb:cursor:load-cursor exwm--connection "right_side")
+ exwm-floating--cursor-bottom-right
+ (xcb:cursor:load-cursor exwm--connection "bottom_right_corner")
+ exwm-floating--cursor-bottom
+ (xcb:cursor:load-cursor exwm--connection "bottom_side")
+ exwm-floating--cursor-bottom-left
+ (xcb:cursor:load-cursor exwm--connection "bottom_left_corner")
+ exwm-floating--cursor-left
+ (xcb:cursor:load-cursor exwm--connection "left_side")))
+
+(defun exwm-floating--exit ()
+ "Exit the floating module."
+ (exwm--log))
+
+(provide 'exwm-floating)
+;;; exwm-floating.el ends here
diff --git a/elpa/exwm-0.33/exwm-floating.elc b/elpa/exwm-0.33/exwm-floating.elc
new file mode 100644
index 0000000..734ae84
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-floating.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-input.el b/elpa/exwm-0.33/exwm-input.el
new file mode 100644
index 0000000..fc0d0b1
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-input.el
@@ -0,0 +1,1223 @@
+;;; exwm-input.el --- Input Module for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 module deals with key/mouse matters, including:
+;; + Input focus,
+;; + Key/Button event handling,
+;; + Key events filtering and simulation.
+
+;; Todo:
+;; + Pointer simulation mode (e.g. 'C-c 1'/'C-c 2' for single/double click,
+;; move with arrow keys).
+;; + Simulation keys to mimic Emacs key bindings for text edit (redo, select,
+;; cancel, clear, etc). Some of them are not present on common keyboard
+;; (keycode = 0). May need to use XKB extension.
+
+;;; Code:
+
+(require 'xcb-keysyms)
+(require 'exwm-core)
+
+(defgroup exwm-input nil
+ "Input."
+ :group 'exwm)
+
+(defcustom exwm-input-prefix-keys
+ '(?\C-x ?\C-u ?\C-h ?\M-x ?\M-` ?\M-& ?\M-:)
+ "List of prefix keys EXWM should forward to Emacs when in `line-mode'.
+
+There is no need to add prefix keys for global/simulation keys or those
+defined in `exwm-mode-map' here."
+ :type '(repeat key-sequence)
+ :get (lambda (symbol)
+ (mapcar #'vector (default-value symbol)))
+ :set (lambda (symbol value)
+ (set symbol (mapcar (lambda (i)
+ (if (sequencep i)
+ (aref i 0)
+ i))
+ value))))
+
+(defcustom exwm-input-move-event 's-down-mouse-1
+ "Emacs event to start moving a window."
+ :type 'key-sequence
+ :get (lambda (symbol)
+ (let ((value (default-value symbol)))
+ (if (mouse-event-p value)
+ value
+ (vector value))))
+ :set (lambda (symbol value)
+ (set symbol (if (sequencep value)
+ (aref value 0)
+ value))))
+
+(defcustom exwm-input-resize-event 's-down-mouse-3
+ "Emacs event to start resizing a window."
+ :type 'key-sequence
+ :get (lambda (symbol)
+ (let ((value (default-value symbol)))
+ (if (mouse-event-p value)
+ value
+ (vector value))))
+ :set (lambda (symbol value)
+ (set symbol (if (sequencep value)
+ (aref value 0)
+ value))))
+
+(defcustom exwm-input-line-mode-passthrough nil
+ "Non-nil makes `line-mode' forward all events to Emacs."
+ :type 'boolean)
+
+;; Input focus update requests should be accumulated for a short time
+;; interval so that only the last one need to be processed. This not
+;; improves the overall performance, but avoids the problem of input
+;; focus loop, which is a result of the interaction with Emacs frames.
+;;
+;; FIXME: The time interval is hard to decide and perhaps machine-dependent.
+;; A value too small can cause redundant updates of input focus,
+;; and even worse, dead loops. OTOH a large value would bring
+;; laggy experience.
+(defconst exwm-input--update-focus-interval 0.01
+ "Time interval (in seconds) for accumulating input focus update requests.")
+
+(defconst exwm-input--passthrough-functions '(read-char
+ read-char-exclusive
+ read-key-sequence-vector
+ read-key-sequence
+ read-event)
+ "Low-level read functions that must be exempted from EXWM input handling.")
+
+(defvar exwm-input--global-keys nil "Global key bindings.")
+
+(defvar exwm-input--global-prefix-keys nil
+ "List of prefix keys of global key bindings.")
+
+(defvar exwm-input--line-mode-cache nil "Cache for incomplete key sequence.")
+
+(defvar exwm-input--local-simulation-keys nil
+ "Whether simulation keys are local.")
+
+(defvar exwm-input--simulation-keys nil "Simulation keys in `line-mode'.")
+
+(defvar exwm-input--skip-buffer-list-update nil
+ "Skip the upcoming `buffer-list-update'.")
+
+(defvar exwm-input--temp-line-mode nil
+ "Non-nil indicates it's in temporary line-mode for `char-mode'.")
+
+(defvar exwm-input--timestamp-atom nil)
+
+(defvar exwm-input--timestamp-callback nil)
+
+(defvar exwm-input--timestamp-window nil)
+
+(defvar exwm-input--update-focus-timer nil
+ "Timer for deferring the update of input focus.")
+
+(defvar exwm-input--update-focus-lock nil
+ "Lock for solving input focus update contention.")
+
+(defvar exwm-input--update-focus-window nil "The (Emacs) window to be focused.
+This value should always be overwritten.")
+
+(defvar exwm-input--echo-area-timer nil "Timer for detecting echo area dirty.")
+
+(defvar exwm-input--event-hook nil
+ "Hook to run when EXWM receives an event.")
+
+(defvar exwm-input-input-mode-change-hook nil
+ "Hook to run when an input mode changes on an `exwm-mode' buffer.
+Current buffer will be the `exwm-mode' buffer when this hook runs.")
+
+(defvar exwm-workspace--current)
+(declare-function exwm-floating--do-moveresize "exwm-floating.el"
+ (data _synthetic))
+(declare-function exwm-floating--start-moveresize "exwm-floating.el"
+ (id &optional type))
+(declare-function exwm-floating--stop-moveresize "exwm-floating.el"
+ (&rest _args))
+(declare-function exwm-layout--iconic-state-p "exwm-layout.el" (&optional id))
+(declare-function exwm-layout--show "exwm-layout.el" (id &optional window))
+(declare-function exwm-reset "exwm.el" ())
+(declare-function exwm-workspace--minibuffer-own-frame-p "exwm-workspace.el")
+(declare-function exwm-workspace--workspace-p "exwm-workspace.el" (workspace))
+(declare-function exwm-workspace-switch "exwm-workspace.el"
+ (frame-or-index &optional force))
+
+(defun exwm-input--set-focus (id)
+ "Set input focus to window ID in a proper way."
+ (let ((from (slot-value (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetInputFocus))
+ 'focus))
+ tree)
+ (if (or (exwm--id->buffer from)
+ (eq from id))
+ (exwm--log "#x%x => #x%x" (or from 0) (or id 0))
+ ;; Attempt to find the top-level X window for a 'focus proxy'.
+ (unless (= from xcb:Window:None)
+ (setq tree (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:QueryTree
+ :window from)))
+ (when tree
+ (setq from (slot-value tree 'parent))))
+ (exwm--log "#x%x (corrected) => #x%x" (or from 0) (or id 0)))
+ (when (and (exwm--id->buffer id)
+ ;; Avoid redundant input focus transfer.
+ (not (eq from id)))
+ (with-current-buffer (exwm--id->buffer id)
+ (exwm-input--update-timestamp
+ (lambda (timestamp id send-input-focus wm-take-focus)
+ (when send-input-focus
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:SetInputFocus
+ :revert-to xcb:InputFocus:Parent
+ :focus id
+ :time timestamp)))
+ (when wm-take-focus
+ (let ((event (make-instance 'xcb:icccm:WM_TAKE_FOCUS
+ :window id
+ :time timestamp)))
+ (setq event (xcb:marshal event exwm--connection))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:icccm:SendEvent
+ :destination id
+ :event event))))
+ (exwm-input--set-active-window id)
+ (xcb:flush exwm--connection))
+ id
+ (or exwm--hints-input
+ (not (memq xcb:Atom:WM_TAKE_FOCUS exwm--protocols)))
+ (memq xcb:Atom:WM_TAKE_FOCUS exwm--protocols))))))
+
+(defun exwm-input--update-timestamp (callback &rest args)
+ "Fetch the latest timestamp from the server and feed it to CALLBACK.
+
+ARGS are additional arguments to CALLBACK."
+ (setq exwm-input--timestamp-callback (cons callback args))
+ (exwm--log)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeProperty
+ :mode xcb:PropMode:Replace
+ :window exwm-input--timestamp-window
+ :property exwm-input--timestamp-atom
+ :type xcb:Atom:CARDINAL
+ :format 32
+ :data-len 0
+ :data nil))
+ (xcb:flush exwm--connection))
+
+(defun exwm-input--on-PropertyNotify (data _synthetic)
+ "Handle PropertyNotify events with DATA."
+ (exwm--log)
+ (when exwm-input--timestamp-callback
+ (let ((obj (make-instance 'xcb:PropertyNotify)))
+ (xcb:unmarshal obj data)
+ (when (= exwm-input--timestamp-window
+ (slot-value obj 'window))
+ (apply (car exwm-input--timestamp-callback)
+ (slot-value obj 'time)
+ (cdr exwm-input--timestamp-callback))
+ (setq exwm-input--timestamp-callback nil)))))
+
+(defvar exwm-input--last-enter-notify-position nil)
+
+(defun exwm-input--on-EnterNotify (data _synthetic)
+ "Handle EnterNotify events with DATA."
+ (let ((evt (make-instance 'xcb:EnterNotify))
+ buffer window frame frame-xid edges fake-evt)
+ (xcb:unmarshal evt data)
+ (with-slots (time root event root-x root-y event-x event-y state) evt
+ (setq buffer (exwm--id->buffer event)
+ window (get-buffer-window buffer t))
+ (exwm--log "buffer=%s; window=%s" buffer window)
+ (when (and buffer window (not (eq window (selected-window)))
+ (not (equal exwm-input--last-enter-notify-position
+ (vector root-x root-y))))
+ (setq frame (window-frame window)
+ frame-xid (frame-parameter frame 'exwm-id))
+ (unless (eq frame exwm-workspace--current)
+ (if (exwm-workspace--workspace-p frame)
+ ;; The X window is on another workspace.
+ (exwm-workspace-switch frame)
+ (with-current-buffer buffer
+ (when (and (derived-mode-p 'exwm-mode)
+ (not (eq exwm--frame exwm-workspace--current)))
+ ;; The floating X window is on another workspace.
+ (exwm-workspace-switch exwm--frame)))))
+ ;; Send a fake MotionNotify event to Emacs.
+ (setq edges (window-inside-pixel-edges window)
+ fake-evt (make-instance 'xcb:MotionNotify
+ :detail 0
+ :time time
+ :root root
+ :event frame-xid
+ :child xcb:Window:None
+ :root-x root-x
+ :root-y root-y
+ :event-x (+ event-x (elt edges 0))
+ :event-y (+ event-y (elt edges 1))
+ :state state
+ :same-screen 1))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination frame-xid
+ :event-mask xcb:EventMask:NoEvent
+ :event (xcb:marshal fake-evt exwm--connection)))
+ (xcb:flush exwm--connection))
+ (setq exwm-input--last-enter-notify-position (vector root-x root-y)))))
+
+(defun exwm-input--on-keysyms-update ()
+ "Update global prefix keys."
+ (exwm--log)
+ (let ((exwm-input--global-prefix-keys nil))
+ (exwm-input--update-global-prefix-keys)))
+
+(defun exwm-input--on-buffer-list-update ()
+ "Run in `buffer-list-update-hook' to track input focus."
+ (when (and ; this hook is called incesantly; place cheap tests on top
+ (not exwm-input--skip-buffer-list-update)
+ (exwm--terminal-p) ; skip other terminals, e.g. TTY client frames
+ (not (frame-parameter nil 'no-accept-focus)))
+ (exwm--log "current-buffer=%S selected-window=%S"
+ (current-buffer) (selected-window))
+ (redirect-frame-focus (selected-frame) nil)
+ (setq exwm-input--update-focus-window (selected-window))
+ (exwm-input--update-focus-defer)))
+
+(defun exwm-input--update-focus-defer ()
+ "Schedule a deferred update to input focus.
+Instead of immediately focusing the current window, it defers the focus change
+until the selected window stops changing (debouncing input focus updates)."
+ (when exwm-input--update-focus-timer
+ (cancel-timer exwm-input--update-focus-timer))
+ (setq exwm-input--update-focus-timer
+ ;; Attempt to accumulate successive events close enough.
+ (run-with-timer exwm-input--update-focus-interval
+ nil
+ #'exwm-input--update-focus-commit)))
+
+(defun exwm-input--update-focus-commit ()
+ "Attempt to update the window focus.
+If we're currently updating the window focus, re-schedule a focus update
+attempt later."
+ (if exwm-input--update-focus-lock
+ (exwm-input--update-focus-defer)
+ (let ((exwm-input--update-focus-lock t))
+ (exwm-input--update-focus exwm-input--update-focus-window))))
+
+(defun exwm-input--update-focus (window)
+ "Update input focus to WINDOW."
+ (when (window-live-p window)
+ (exwm--log "focus-window=%s focus-buffer=%s" window (window-buffer window))
+ (with-current-buffer (window-buffer window)
+ (if (derived-mode-p 'exwm-mode)
+ (if (not (eq exwm--frame exwm-workspace--current))
+ (progn
+ (set-frame-parameter exwm--frame 'exwm-selected-window window)
+ (exwm--defer 0 #'exwm-workspace-switch exwm--frame))
+ (exwm--log "Set focus on #x%x" exwm--id)
+ (when exwm--floating-frame
+ ;; Adjust stacking orders of the floating X window.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window exwm--id
+ :value-mask xcb:ConfigWindow:StackMode
+ :stack-mode xcb:StackMode:TopIf))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm--floating-frame
+ 'exwm-container)
+ :value-mask (logior
+ xcb:ConfigWindow:Sibling
+ xcb:ConfigWindow:StackMode)
+ :sibling exwm--id
+ :stack-mode xcb:StackMode:Below))
+ ;; This floating X window might be hide by `exwm-floating-hide'.
+ (when (exwm-layout--iconic-state-p)
+ (exwm-layout--show exwm--id window))
+ (xcb:flush exwm--connection))
+ (exwm-input--set-focus exwm--id))
+ (when (eq (selected-window) window)
+ (exwm--log "Focus on %s" window)
+ (if (and (exwm-workspace--workspace-p (selected-frame))
+ (not (eq (selected-frame) exwm-workspace--current)))
+ ;; The focus is on another workspace (e.g. it got clicked)
+ ;; so switch to it.
+ (progn
+ (exwm--log "Switching to %s's workspace %s (%s)"
+ window
+ (window-frame window)
+ (selected-frame))
+ (set-frame-parameter (selected-frame) 'exwm-selected-window
+ window)
+ (exwm--defer 0 #'exwm-workspace-switch (selected-frame)))
+ ;; The focus is still on the current workspace.
+ (let ((frame (if (not (and (exwm-workspace--minibuffer-own-frame-p)
+ (minibufferp)))
+ (window-frame window)
+ ;; X input focus should be set on the previously
+ ;; selected frame.
+ (window-frame (minibuffer-window)))))
+ (x-focus-frame frame)
+ (exwm-input--set-active-window
+ (or (frame-parameter exwm-workspace--current 'exwm-outer-id)
+ xcb:Window:None)))
+ (xcb:flush exwm--connection)))))))
+
+(defun exwm-input--set-active-window (id)
+ "Set _NET_ACTIVE_WINDOW to ID."
+ (exwm--log)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_ACTIVE_WINDOW
+ :window exwm--root
+ :data id)))
+
+(defun exwm-input--on-ButtonPress (data _synthetic)
+ "Handle ButtonPress event with DATA."
+ (let ((obj (make-instance 'xcb:ButtonPress))
+ (mode xcb:Allow:SyncPointer)
+ button-event window buffer frame fake-last-command)
+ (xcb:unmarshal obj data)
+ (exwm--log "major-mode=%s buffer=%s"
+ major-mode (buffer-name (current-buffer)))
+ (with-slots (detail event state) obj
+ (setq button-event (xcb:keysyms:keysym->event exwm--connection
+ detail state)
+ buffer (exwm--id->buffer event)
+ window (get-buffer-window buffer t))
+ (cond ((and (eq button-event exwm-input-move-event)
+ buffer
+ ;; Either an undecorated or a floating X window.
+ (with-current-buffer buffer
+ (or (not (derived-mode-p 'exwm-mode))
+ exwm--floating-frame)))
+ ;; Move
+ (exwm-floating--start-moveresize
+ event xcb:ewmh:_NET_WM_MOVERESIZE_MOVE))
+ ((and (eq button-event exwm-input-resize-event)
+ buffer
+ (with-current-buffer buffer
+ (or (not (derived-mode-p 'exwm-mode))
+ exwm--floating-frame)))
+ ;; Resize
+ (exwm-floating--start-moveresize event))
+ (buffer
+ ;; Click to focus
+ (setq fake-last-command t)
+ (unless (eq window (selected-window))
+ (setq frame (window-frame window))
+ (unless (eq frame exwm-workspace--current)
+ (if (exwm-workspace--workspace-p frame)
+ ;; The X window is on another workspace
+ (exwm-workspace-switch frame)
+ (with-current-buffer buffer
+ (when (and (derived-mode-p 'exwm-mode)
+ (not (eq exwm--frame
+ exwm-workspace--current)))
+ ;; The floating X window is on another workspace
+ (exwm-workspace-switch exwm--frame)))))
+ ;; It has been reported that the `window' may have be deleted
+ (if (window-live-p window)
+ (select-window window)
+ (setq window (get-buffer-window buffer t))
+ (when window (select-window window))))
+ ;; Also process keybindings.
+ (with-current-buffer buffer
+ (when (derived-mode-p 'exwm-mode)
+ (cl-case exwm--input-mode
+ (line-mode
+ (setq mode (exwm-input--on-ButtonPress-line-mode
+ buffer button-event)))
+ (char-mode
+ (setq mode (exwm-input--on-ButtonPress-char-mode)))))))
+ (t
+ ;; Replay this event by default.
+ (setq fake-last-command t)
+ (setq mode xcb:Allow:ReplayPointer)))
+ (when fake-last-command
+ (if buffer
+ (with-current-buffer buffer
+ (exwm-input--fake-last-command))
+ (exwm-input--fake-last-command))))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:AllowEvents :mode mode :time xcb:Time:CurrentTime))
+ (xcb:flush exwm--connection))
+ (run-hooks 'exwm-input--event-hook))
+
+(defun exwm-input--on-KeyPress (data _synthetic)
+ "Handle KeyPress event with DATA."
+ (with-current-buffer (window-buffer (selected-window))
+ (let ((obj (make-instance 'xcb:KeyPress)))
+ (xcb:unmarshal obj data)
+ (exwm--log "major-mode=%s buffer=%s"
+ major-mode (buffer-name (current-buffer)))
+ (if (derived-mode-p 'exwm-mode)
+ (cl-case exwm--input-mode
+ (line-mode
+ (exwm-input--on-KeyPress-line-mode obj data))
+ (char-mode
+ (exwm-input--on-KeyPress-char-mode obj data)))
+ (exwm-input--on-KeyPress-char-mode obj)))
+ (run-hooks 'exwm-input--event-hook)))
+
+(defun exwm-input--on-CreateNotify (data _synthetic)
+ "Handle CreateNotify events with DATA."
+ (exwm--log)
+ (let ((evt (make-instance 'xcb:CreateNotify)))
+ (xcb:unmarshal evt data)
+ (with-slots (window) evt
+ (exwm-input--grab-global-prefix-keys window))))
+
+(defun exwm-input--update-global-prefix-keys ()
+ "Update `exwm-input--global-prefix-keys'."
+ (exwm--log)
+ (when exwm--connection
+ (let ((original exwm-input--global-prefix-keys))
+ (setq exwm-input--global-prefix-keys nil)
+ (dolist (i exwm-input--global-keys)
+ (cl-pushnew (elt i 0) exwm-input--global-prefix-keys))
+ (unless (equal original exwm-input--global-prefix-keys)
+ (apply #'exwm-input--grab-global-prefix-keys
+ (slot-value (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:QueryTree
+ :window exwm--root))
+ 'children))))))
+
+(defun exwm-input--grab-global-prefix-keys (&rest xwins)
+ "Grab global prefix keys in XWINS."
+ (exwm--log)
+ (let ((req (make-instance 'xcb:GrabKey
+ :owner-events 0
+ :grab-window nil
+ :modifiers nil
+ :key nil
+ :pointer-mode xcb:GrabMode:Async
+ :keyboard-mode xcb:GrabMode:Async))
+ keysyms keycode alt-modifier)
+ (dolist (k exwm-input--global-prefix-keys)
+ (setq keysyms (xcb:keysyms:event->keysyms exwm--connection k))
+ (if (not keysyms)
+ (warn "Key unavailable: %s" (key-description (vector k)))
+ (setq keycode (xcb:keysyms:keysym->keycode exwm--connection
+ (caar keysyms)))
+ (exwm--log "Grabbing key=%s (keysyms=%s keycode=%s)"
+ (single-key-description k) keysyms keycode)
+ (dolist (keysym keysyms)
+ (setf (slot-value req 'modifiers) (cdr keysym)
+ (slot-value req 'key) keycode)
+ ;; Also grab this key with num-lock mask set.
+ (when (and (/= 0 xcb:keysyms:num-lock-mask)
+ (= 0 (logand (cdr keysym) xcb:keysyms:num-lock-mask)))
+ (setf alt-modifier (logior (cdr keysym)
+ xcb:keysyms:num-lock-mask)))
+ (dolist (xwin xwins)
+ (setf (slot-value req 'grab-window) xwin)
+ (xcb:+request exwm--connection req)
+ (when alt-modifier
+ (setf (slot-value req 'modifiers) alt-modifier)
+ (xcb:+request exwm--connection req))))))
+ (xcb:flush exwm--connection)))
+
+(defun exwm-input--set-key (key command)
+ "Set KEY to COMMAND."
+ (exwm--log "key: %s, command: %s" key command)
+ (global-set-key key command)
+ (cl-pushnew key exwm-input--global-keys))
+
+(defcustom exwm-input-global-keys nil
+ "Global keys.
+
+It is an alist of the form (key . command), meaning giving KEY (a key
+sequence) a global binding as COMMAND.
+
+Notes:
+* Setting the value directly (rather than customizing it) after EXWM
+ finishes initialization has no effect."
+ :type '(alist :key-type key-sequence :value-type function)
+ :set (lambda (symbol value)
+ (when (boundp symbol)
+ (dolist (i (symbol-value symbol))
+ (global-unset-key (car i))))
+ (set symbol value)
+ (setq exwm-input--global-keys nil)
+ (dolist (i value)
+ (exwm-input--set-key (car i) (cdr i)))
+ (when exwm--connection
+ (exwm-input--update-global-prefix-keys))))
+
+(defun exwm-input-set-key (key command)
+ "Set a global KEY binding to COMMAND.
+
+The new binding only takes effect in real time when this command is
+called interactively, and is lost when this session ends unless it's
+specifically saved in the Customize interface for `exwm-input-global-keys'.
+
+In configuration you should customize or set `exwm-input-global-keys'
+instead."
+ (interactive "KSet key globally: \nCSet key %s to command: ")
+ (exwm--log)
+ (setq exwm-input-global-keys (append exwm-input-global-keys
+ (list (cons key command))))
+ (exwm-input--set-key key command)
+ (when (called-interactively-p 'any)
+ (exwm-input--update-global-prefix-keys)))
+
+(defsubst exwm-input--unread-event (event)
+ "Append EVENT to `unread-command-events'."
+ (declare (indent defun))
+ (setq unread-command-events
+ (append unread-command-events `((t . ,event)))))
+
+(defun exwm-input--mimic-read-event (event)
+ "Process EVENT as if it were returned by `read-event'."
+ (exwm--log)
+ (unless (eq 0 extra-keyboard-modifiers)
+ (setq event (event-convert-list (append (event-modifiers
+ extra-keyboard-modifiers)
+ event))))
+ (when (characterp event)
+ (let ((event* (when keyboard-translate-table
+ (aref keyboard-translate-table event))))
+ (when event*
+ (setq event event*))))
+ event)
+
+(cl-defun exwm-input--translate (key)
+ "Translate KEY."
+ (let (translation)
+ (dolist (map (list input-decode-map
+ local-function-key-map
+ key-translation-map))
+ (setq translation (lookup-key map key))
+ (if (functionp translation)
+ (cl-return-from exwm-input--translate (funcall translation nil))
+ (when (vectorp translation)
+ (cl-return-from exwm-input--translate translation)))))
+ key)
+
+(defun exwm-input--cache-event (event &optional temp-line-mode)
+ "Cache EVENT.
+When non-nil, TEMP-LINE-MODE temporarily puts the window in line mode."
+ (exwm--log "%s" event)
+ (setq exwm-input--line-mode-cache
+ (vconcat exwm-input--line-mode-cache (vector event)))
+ ;; Attempt to translate this key sequence.
+ (setq exwm-input--line-mode-cache
+ (exwm-input--translate exwm-input--line-mode-cache))
+ ;; When the key sequence is complete (not a keymap).
+ ;; Note that `exwm-input--line-mode-cache' might get translated to nil, for
+ ;; example 'mouse--down-1-maybe-follows-link' does this.
+ (if (and exwm-input--line-mode-cache
+ (keymapp (key-binding exwm-input--line-mode-cache)))
+ ;; Grab keyboard temporarily to intercept the complete key sequence.
+ (when temp-line-mode
+ (setq exwm-input--temp-line-mode t)
+ (exwm-input--grab-keyboard))
+ (setq exwm-input--line-mode-cache nil)
+ (when exwm-input--temp-line-mode
+ (setq exwm-input--temp-line-mode nil)
+ (exwm-input--release-keyboard))))
+
+(defun exwm-input--event-passthrough-p (event)
+ "Whether EVENT should be passed to Emacs.
+Current buffer must be an `exwm-mode' buffer."
+ (or exwm-input-line-mode-passthrough
+ ;; Forward the event when there is an incomplete key
+ ;; sequence or when the minibuffer is active.
+ exwm-input--line-mode-cache
+ (eq (active-minibuffer-window) (selected-window))
+ ;;
+ (memq event exwm-input--global-prefix-keys)
+ (memq event exwm-input-prefix-keys)
+ (when overriding-terminal-local-map
+ (lookup-key overriding-terminal-local-map
+ (vector event)))
+ (lookup-key (current-local-map) (vector event))
+ (gethash event exwm-input--simulation-keys)))
+
+(defun exwm-input--noop (&rest _args)
+ "A placeholder command."
+ (interactive))
+
+(defun exwm-input--fake-last-command ()
+ "Fool some packages into thinking there is a change in the buffer."
+ (setq last-command #'exwm-input--noop)
+ ;; The Emacs manual says:
+ ;; > Quitting is suppressed while running pre-command-hook and
+ ;; > post-command-hook. If an error happens while executing one of these
+ ;; > hooks, it does not terminate execution of the hook; instead the error is
+ ;; > silenced and the function in which the error occurred is removed from the
+ ;; > hook.
+ ;; We supress errors but neither continue execution nor we remove from the
+ ;; hook.
+ (condition-case err
+ (run-hooks 'pre-command-hook)
+ ((error)
+ (exwm--log "Error occurred while running pre-command-hook: %s"
+ (error-message-string err))
+ (xcb-debug:backtrace)))
+ (condition-case err
+ (run-hooks 'post-command-hook)
+ ((error)
+ (exwm--log "Error occurred while running post-command-hook: %s"
+ (error-message-string err))
+ (xcb-debug:backtrace))))
+
+(defun exwm-input--on-KeyPress-line-mode (keypress raw-data)
+ "Feed parsed X KEYPRESS event with RAW-DATA to Emacs command loop."
+ (with-slots (detail state) keypress
+ (let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail state))
+ event raw-event mode)
+ (exwm--log "%s" keysym)
+ (when (and (/= 0 (car keysym))
+ (setq raw-event (xcb:keysyms:keysym->event
+ exwm--connection (car keysym)
+ (logand state (lognot (cdr keysym)))))
+ (setq event (exwm-input--mimic-read-event raw-event))
+ (exwm-input--event-passthrough-p event))
+ (setq mode xcb:Allow:AsyncKeyboard)
+ (exwm-input--cache-event event)
+ (exwm-input--unread-event raw-event))
+ (unless mode
+ (if (= 0 (logand #x6000 state)) ;Check the 13~14 bits.
+ ;; Not an XKB state; just replay it.
+ (setq mode xcb:Allow:ReplayKeyboard)
+ ;; An XKB state; sent it with SendEvent.
+ ;; FIXME: Can this also be replayed?
+ ;; FIXME: KeyRelease events are lost.
+ (setq mode xcb:Allow:AsyncKeyboard)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination (slot-value keypress 'event)
+ :event-mask xcb:EventMask:NoEvent
+ :event raw-data)))
+ (when event
+ (if (not defining-kbd-macro)
+ (exwm-input--fake-last-command)
+ ;; Make Emacs aware of this event when defining keyboard macros.
+ (set-transient-map `(keymap (t . ,#'exwm-input--noop)))
+ (exwm-input--unread-event event))))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:AllowEvents
+ :mode mode
+ :time xcb:Time:CurrentTime))
+ (xcb:flush exwm--connection))))
+
+(defun exwm-input--on-KeyPress-char-mode (keypress &optional _raw-data)
+ "Handle `char-mode' KEYPRESS event."
+ (with-slots (detail state) keypress
+ (let ((keysym (xcb:keysyms:keycode->keysym exwm--connection detail state))
+ event raw-event)
+ (exwm--log "%s" keysym)
+ (when (and (/= 0 (car keysym))
+ (setq raw-event (xcb:keysyms:keysym->event
+ exwm--connection (car keysym)
+ (logand state (lognot (cdr keysym)))))
+ (setq event (exwm-input--mimic-read-event raw-event)))
+ (if (not (derived-mode-p 'exwm-mode))
+ (exwm-input--unread-event raw-event)
+ (exwm-input--cache-event event t)
+ (exwm-input--unread-event raw-event)))))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:AllowEvents
+ :mode xcb:Allow:AsyncKeyboard
+ :time xcb:Time:CurrentTime))
+ (xcb:flush exwm--connection))
+
+(defun exwm-input--on-ButtonPress-line-mode (buffer button-event)
+ "Handle button events in line mode.
+BUFFER is the `exwm-mode' buffer the event was generated
+on. BUTTON-EVENT is the X event converted into an Emacs event.
+
+The return value is used as event_mode to release the original
+button event."
+ (with-current-buffer buffer
+ (let ((read-event (exwm-input--mimic-read-event button-event)))
+ (exwm--log "%s" read-event)
+ (if (and read-event
+ (exwm-input--event-passthrough-p read-event))
+ ;; The event should be forwarded to emacs
+ (progn
+ (exwm-input--cache-event read-event)
+ (exwm-input--unread-event button-event)
+ xcb:Allow:SyncPointer)
+ ;; The event should be replayed
+ xcb:Allow:ReplayPointer))))
+
+(defun exwm-input--on-ButtonPress-char-mode ()
+ "Handle button events in `char-mode'.
+The return value is used as event_mode to release the original
+button event."
+ (exwm--log)
+ xcb:Allow:ReplayPointer)
+
+(defun exwm-input--update-mode-line (id)
+ "Update the propertized `mode-line-process' for window ID."
+ (exwm--log "#x%x" id)
+ (let (help-echo cmd mode)
+ (with-current-buffer (exwm--id->buffer id)
+ (cl-case exwm--input-mode
+ (line-mode
+ (setq mode "line"
+ help-echo "mouse-1: Switch to char-mode"
+ cmd (lambda ()
+ (interactive)
+ (exwm-input-release-keyboard id))))
+ (char-mode
+ (setq mode "char"
+ help-echo "mouse-1: Switch to line-mode"
+ cmd (lambda ()
+ (interactive)
+ (exwm-input-grab-keyboard id)))))
+ (setq mode-line-process
+ `(": "
+ (:propertize ,mode
+ help-echo ,help-echo
+ mouse-face mode-line-highlight
+ local-map
+ (keymap
+ (mode-line
+ keymap
+ (down-mouse-1 . ,cmd))))))
+ (force-mode-line-update))))
+
+(defun exwm-input--grab-keyboard (&optional id)
+ "Grab all key events on window ID."
+ (unless id (setq id (exwm--buffer->id (window-buffer))))
+ (when id
+ (exwm--log "id=#x%x" id)
+ (when (xcb:+request-checked+request-check exwm--connection
+ (make-instance 'xcb:GrabKey
+ :owner-events 0
+ :grab-window id
+ :modifiers xcb:ModMask:Any
+ :key xcb:Grab:Any
+ :pointer-mode xcb:GrabMode:Async
+ :keyboard-mode xcb:GrabMode:Sync))
+ (exwm--log "Failed to grab keyboard for #x%x" id))
+ (let ((buffer (exwm--id->buffer id)))
+ (when buffer
+ (with-current-buffer buffer
+ (setq exwm--input-mode 'line-mode)
+ (run-hooks 'exwm-input-input-mode-change-hook))))))
+
+(defun exwm-input--release-keyboard (&optional id)
+ "Ungrab all key events on window ID."
+ (unless id (setq id (exwm--buffer->id (window-buffer))))
+ (when id
+ (exwm--log "id=#x%x" id)
+ (when (xcb:+request-checked+request-check exwm--connection
+ (make-instance 'xcb:UngrabKey
+ :key xcb:Grab:Any
+ :grab-window id
+ :modifiers xcb:ModMask:Any))
+ (exwm--log "Failed to release keyboard for #x%x" id))
+ (exwm-input--grab-global-prefix-keys id)
+ (let ((buffer (exwm--id->buffer id)))
+ (when buffer
+ (with-current-buffer buffer
+ (setq exwm--input-mode 'char-mode)
+ (run-hooks 'exwm-input-input-mode-change-hook))))))
+
+(defun exwm-input-grab-keyboard (&optional id)
+ "Switch to `line-mode`.
+When ID is non-nil, grab key events on its corresponding window."
+ (interactive (list (when (derived-mode-p 'exwm-mode)
+ (exwm--buffer->id (window-buffer)))))
+ (when id
+ (exwm--log "id=#x%x" id)
+ (setq exwm--selected-input-mode 'line-mode)
+ (exwm-input--grab-keyboard id)
+ (exwm-input--update-mode-line id)))
+
+(defun exwm-input-release-keyboard (&optional id)
+ "Switch to `char-mode`.
+When ID is non-nil, release keyboard events on its corresponding window."
+ (interactive (list (when (derived-mode-p 'exwm-mode)
+ (exwm--buffer->id (window-buffer)))))
+ (when id
+ (exwm--log "id=#x%x" id)
+ (setq exwm--selected-input-mode 'char-mode)
+ (exwm-input--release-keyboard id)
+ (exwm-input--update-mode-line id)))
+
+(defun exwm-input-toggle-keyboard (&optional id)
+ "Toggle between `line-mode' and `char-mode'.
+When ID is non-nil, toggle in its correpsonding window."
+ (interactive (list (when (derived-mode-p 'exwm-mode)
+ (exwm--buffer->id (window-buffer)))))
+ (when id
+ (exwm--log "id=#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (cl-case exwm--input-mode
+ (line-mode
+ (exwm-input-release-keyboard id))
+ (char-mode
+ (exwm-reset))))))
+
+(defun exwm-input--fake-key (event)
+ "Fake a key event equivalent to Emacs event EVENT."
+ (let* ((keysyms (xcb:keysyms:event->keysyms exwm--connection event))
+ keycode id)
+ (when (= 0 (caar keysyms))
+ (user-error "[EXWM] Invalid key: %s" (single-key-description event)))
+ (setq keycode (xcb:keysyms:keysym->keycode exwm--connection
+ (caar keysyms)))
+ (when (/= 0 keycode)
+ (setq id (exwm--buffer->id (window-buffer (selected-window))))
+ (exwm--log "id=#x%x event=%s keycode" id event keycode)
+ (dolist (class '(xcb:KeyPress xcb:KeyRelease))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0 :destination id
+ :event-mask xcb:EventMask:NoEvent
+ :event (xcb:marshal
+ (make-instance class
+ :detail keycode
+ :time xcb:Time:CurrentTime
+ :root exwm--root :event id
+ :child 0
+ :root-x 0 :root-y 0
+ :event-x 0 :event-y 0
+ :state (cdar keysyms)
+ :same-screen 1)
+ exwm--connection)))))
+ (xcb:flush exwm--connection)))
+
+(cl-defun exwm-input-send-next-key (n &optional end-key)
+ "Send next N keys to client window.
+N is currently capped at 12.
+EXWM will prompt for the key to send.
+If END-KEY is non-nil, stop sending keys if it's pressed."
+ (interactive "p")
+ (exwm--log)
+ (unless (derived-mode-p 'exwm-mode) (cl-return-from exwm-input-send-next-key))
+ (setq n (min n 12))
+ (let (key keys)
+ (dotimes (i n)
+ ;; Skip events not from keyboard
+ (let ((exwm-input-line-mode-passthrough t))
+ (catch 'break
+ (while t
+ (setq key (read-key (format "Send key: %s (%d/%d) %s"
+ (key-description keys)
+ (1+ i) n
+ (if end-key
+ (concat "To exit, press: "
+ (key-description
+ (list end-key)))
+ ""))))
+ (unless (listp key) (throw 'break nil)))))
+ (setq keys (vconcat keys (vector key)))
+ (when (eq key end-key) (cl-return-from exwm-input-send-next-key))
+ (exwm-input--fake-key key))))
+
+(defun exwm-input--set-simulation-keys (keys &optional cache)
+ "Set simulation KEYS.
+If CACHE is non-nil reuse `exwm-input--simulation-keys' cache."
+ (exwm--log "%s" keys)
+ (unless cache
+ ;; Unbind simulation keys.
+ (let ((hash (buffer-local-value 'exwm-input--simulation-keys
+ (current-buffer))))
+ (when (hash-table-p hash)
+ (maphash (lambda (key _value)
+ (when (sequencep key)
+ (if exwm-input--local-simulation-keys
+ (local-unset-key key)
+ (define-key exwm-mode-map key nil))))
+ hash)))
+ ;; Abandon the old hash table.
+ (setq exwm-input--simulation-keys (make-hash-table :test #'equal)))
+ (dolist (i keys)
+ (let ((original (vconcat (car i)))
+ (simulated (cdr i)))
+ (setq simulated (if (sequencep simulated)
+ (append simulated nil)
+ (list simulated)))
+ ;; The key stored is a key sequence (vector).
+ ;; The value stored is a list of key events.
+ (puthash original simulated exwm-input--simulation-keys)
+ ;; Also mark the prefix key as used.
+ (puthash (aref original 0) t exwm-input--simulation-keys)))
+ ;; Update keymaps.
+ (maphash (lambda (key _value)
+ (when (sequencep key)
+ (if exwm-input--local-simulation-keys
+ (local-set-key key #'exwm-input-send-simulation-key)
+ (define-key exwm-mode-map key
+ #'exwm-input-send-simulation-key))))
+ exwm-input--simulation-keys))
+
+(defcustom exwm-input-simulation-keys nil
+ "Simulation keys.
+
+It is an alist of the form (original-key . simulated-key), where both
+original-key and simulated-key are key sequences. Original-key is what you
+type to an X window in `line-mode' which then gets translated to simulated-key
+by EXWM and forwarded to the X window.
+
+Notes:
+* Setting the value directly (rather than customizing it) after EXWM
+ finishes initialization has no effect.
+* Original-keys consist of multiple key events are only supported in Emacs
+ 26.2 and later.
+* A minority of applications do not accept simulated keys by default. It's
+ required to customize them to accept events sent by SendEvent.
+* The predefined examples in the Customize interface are not guaranteed to
+ work for all applications. This can be tweaked on a per application basis
+ with `exwm-input-set-local-simulation-keys'."
+ :type '(alist :key-type (key-sequence :tag "Original")
+ :value-type (choice (key-sequence :tag "User-defined")
+ (key-sequence :tag "Move left" [left])
+ (key-sequence :tag "Move right" [right])
+ (key-sequence :tag "Move up" [up])
+ (key-sequence :tag "Move down" [down])
+ (key-sequence :tag "Move to BOL" [home])
+ (key-sequence :tag "Move to EOL" [end])
+ (key-sequence :tag "Page up" [prior])
+ (key-sequence :tag "Page down" [next])
+ (key-sequence :tag "Copy" [C-c])
+ (key-sequence :tag "Paste" [C-v])
+ (key-sequence :tag "Delete" [delete])
+ (key-sequence :tag "Delete to EOL"
+ [S-end delete])))
+ :set (lambda (symbol value)
+ (set symbol value)
+ (exwm-input--set-simulation-keys value)))
+
+(cl-defun exwm-input--read-keys (prompt stop-key)
+ "Read keys with PROMPT until STOP-KEY pressed."
+ (let ((cursor-in-echo-area t)
+ keys key)
+ (while (not (eq key stop-key))
+ (setq key (read-key (format "%s (terminate with %s): %s"
+ prompt
+ (key-description (vector stop-key))
+ (key-description keys)))
+ keys (vconcat keys (vector key))))
+ (when (> (length keys) 1)
+ (substring keys 0 -1))))
+
+(defun exwm-input-set-simulation-key (original-key simulated-key)
+ "Set ORIGINAL-KEY to SIMULATED-KEY.
+
+The simulation key takes effect in real time, but is lost when this session
+ends unless it's specifically saved in the Customize interface for
+`exwm-input-simulation-keys'."
+ (interactive
+ (let (original simulated)
+ (setq original (exwm-input--read-keys "Translate from" ?\C-g))
+ (when original
+ (setq simulated (exwm-input--read-keys
+ (format "Translate from %s to"
+ (key-description original))
+ ?\C-g)))
+ (list original simulated)))
+ (exwm--log "original: %s, simulated: %s" original-key simulated-key)
+ (when (and original-key simulated-key)
+ (let ((entry `((,original-key . ,simulated-key))))
+ (setq exwm-input-simulation-keys (append exwm-input-simulation-keys
+ entry))
+ (exwm-input--set-simulation-keys entry t))))
+
+(defun exwm-input--unset-simulation-keys ()
+ "Clear simulation keys and key bindings defined."
+ (exwm--log)
+ (when (hash-table-p exwm-input--simulation-keys)
+ (maphash (lambda (key _value)
+ (when (sequencep key)
+ (define-key exwm-mode-map key nil)))
+ exwm-input--simulation-keys)
+ (clrhash exwm-input--simulation-keys)))
+
+(defun exwm-input-set-local-simulation-keys (simulation-keys)
+ "Set buffer-local simulation keys.
+
+SIMULATION-KEYS is an alist of the form (original-key . simulated-key),
+where both ORIGINAL-KEY and SIMULATED-KEY are key sequences."
+ (exwm--log)
+ (make-local-variable 'exwm-input--simulation-keys)
+ (use-local-map (copy-keymap exwm-mode-map))
+ (let ((exwm-input--local-simulation-keys t))
+ (exwm-input--set-simulation-keys simulation-keys)))
+
+(cl-defun exwm-input-send-simulation-key (n)
+ "Fake N key events according to the last input key sequence."
+ (interactive "p")
+ (exwm--log)
+ (unless (derived-mode-p 'exwm-mode)
+ (cl-return-from exwm-input-send-simulation-key))
+ (let ((keys (gethash (this-single-command-keys)
+ exwm-input--simulation-keys)))
+ (dotimes (_ n)
+ (dolist (key keys)
+ (exwm-input--fake-key key)))))
+
+(defmacro exwm-input-invoke-factory (keys)
+ "Make a command that invokes KEYS when called.
+
+One use is to access the keymap bound to KEYS (as prefix keys) in `char-mode'."
+ (let* ((keys (kbd keys))
+ (description (key-description keys)))
+ `(defun ,(intern (concat "exwm-input--invoke--" description)) ()
+ ,(format "Invoke `%s'." description)
+ (interactive)
+ (mapc (lambda (key)
+ (exwm-input--cache-event key t)
+ (exwm-input--unread-event key))
+ ',(listify-key-sequence keys)))))
+
+(defun exwm-input--on-minibuffer-setup ()
+ "Run in `minibuffer-setup-hook' to grab keyboard if necessary."
+ (let* ((window (or (minibuffer-selected-window) ; minibuffer-setup-hook
+ (selected-window))) ; echo-area-clear-hook
+ (frame (window-frame window)))
+ (when (exwm--terminal-p frame)
+ (with-current-buffer (window-buffer window)
+ (when (and (derived-mode-p 'exwm-mode)
+ (eq exwm--selected-input-mode 'char-mode))
+ (exwm--log "Grab #x%x window=%s frame=%s" exwm--id window frame)
+ (exwm-input--grab-keyboard exwm--id))))))
+
+(defun exwm-input--on-minibuffer-exit ()
+ "Run in `minibuffer-exit-hook' to release keyboard if necessary."
+ (let* ((window (or (minibuffer-selected-window) ; minibuffer-setup-hook
+ (selected-window))) ; echo-area-clear-hook
+ (frame (window-frame window)))
+ (when (exwm--terminal-p frame)
+ (with-current-buffer (window-buffer window)
+ (when (and (derived-mode-p 'exwm-mode)
+ (eq exwm--selected-input-mode 'char-mode)
+ (eq exwm--input-mode 'line-mode))
+ (exwm--log "Release #x%x window=%s frame=%s" exwm--id window frame)
+ (exwm-input--release-keyboard exwm--id))))))
+
+(defun exwm-input--on-echo-area-dirty ()
+ "Run when new message arrives to grab keyboard if necessary."
+ (when (and cursor-in-echo-area
+ (not (active-minibuffer-window)))
+ (exwm--log)
+ (exwm-input--on-minibuffer-setup)))
+
+(defun exwm-input--on-echo-area-clear ()
+ "Run in `echo-area-clear-hook' to release keyboard if necessary."
+ (unless (current-message)
+ (exwm--log)
+ (exwm-input--on-minibuffer-exit)))
+
+(defun exwm-input--call-with-passthrough (function &rest args)
+ "Bind `exwm-input-line-mode-passthrough' and call FUNCTION with ARGS."
+ (let ((exwm-input-line-mode-passthrough t))
+ (apply function args)))
+
+(defun exwm-input--init ()
+ "Initialize the keyboard module."
+ (exwm--log)
+ ;; Refresh keyboard mapping
+ (xcb:keysyms:init exwm--connection #'exwm-input--on-keysyms-update)
+ ;; Create the X window and intern the atom used to fetch timestamp.
+ (setq exwm-input--timestamp-window (xcb:generate-id exwm--connection))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:CreateWindow
+ :depth 0
+ :wid exwm-input--timestamp-window
+ :parent exwm--root
+ :x -1
+ :y -1
+ :width 1
+ :height 1
+ :border-width 0
+ :class xcb:WindowClass:CopyFromParent
+ :visual 0
+ :value-mask xcb:CW:EventMask
+ :event-mask xcb:EventMask:PropertyChange))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window exwm-input--timestamp-window
+ :data "EXWM: exwm-input--timestamp-window"))
+ (setq exwm-input--timestamp-atom (exwm--intern-atom "_TIME"))
+ ;; Initialize global keys.
+ (dolist (i exwm-input-global-keys)
+ (exwm-input--set-key (car i) (cdr i)))
+ ;; Initialize simulation keys.
+ (when exwm-input-simulation-keys
+ (exwm-input--set-simulation-keys exwm-input-simulation-keys))
+ ;; Attach event listeners
+ (xcb:+event exwm--connection 'xcb:PropertyNotify
+ #'exwm-input--on-PropertyNotify)
+ (xcb:+event exwm--connection 'xcb:CreateNotify #'exwm-input--on-CreateNotify)
+ (xcb:+event exwm--connection 'xcb:KeyPress #'exwm-input--on-KeyPress)
+ (xcb:+event exwm--connection 'xcb:ButtonPress #'exwm-input--on-ButtonPress)
+ (xcb:+event exwm--connection 'xcb:ButtonRelease
+ #'exwm-floating--stop-moveresize)
+ (xcb:+event exwm--connection 'xcb:MotionNotify
+ #'exwm-floating--do-moveresize)
+ (when mouse-autoselect-window
+ (xcb:+event exwm--connection 'xcb:EnterNotify
+ #'exwm-input--on-EnterNotify))
+ ;; Grab/Release keyboard when minibuffer/echo becomes active/inactive.
+ (add-hook 'minibuffer-setup-hook #'exwm-input--on-minibuffer-setup)
+ (add-hook 'minibuffer-exit-hook #'exwm-input--on-minibuffer-exit)
+ (setq exwm-input--echo-area-timer
+ (run-with-idle-timer 0 t #'exwm-input--on-echo-area-dirty))
+ (add-hook 'echo-area-clear-hook #'exwm-input--on-echo-area-clear)
+ ;; Update focus when buffer list updates
+ (add-hook 'buffer-list-update-hook #'exwm-input--on-buffer-list-update)
+
+ (dolist (fun exwm-input--passthrough-functions)
+ (advice-add fun :around #'exwm-input--call-with-passthrough)))
+
+(defun exwm-input--post-init ()
+ "The second stage in the initialization of the input module."
+ (exwm--log)
+ (exwm-input--update-global-prefix-keys))
+
+(defun exwm-input--exit ()
+ "Exit the input module."
+ (exwm--log)
+ (dolist (fun exwm-input--passthrough-functions)
+ (advice-remove fun #'exwm-input--call-with-passthrough))
+ (exwm-input--unset-simulation-keys)
+ (remove-hook 'minibuffer-setup-hook #'exwm-input--on-minibuffer-setup)
+ (remove-hook 'minibuffer-exit-hook #'exwm-input--on-minibuffer-exit)
+ (when exwm-input--echo-area-timer
+ (cancel-timer exwm-input--echo-area-timer)
+ (setq exwm-input--echo-area-timer nil))
+ (remove-hook 'echo-area-clear-hook #'exwm-input--on-echo-area-clear)
+ (remove-hook 'buffer-list-update-hook #'exwm-input--on-buffer-list-update)
+ (when exwm-input--update-focus-timer
+ (cancel-timer exwm-input--update-focus-timer))
+ ;; Make input focus working even without a WM.
+ (when (slot-value exwm--connection 'connected)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:SetInputFocus
+ :revert-to xcb:InputFocus:PointerRoot
+ :focus exwm--root
+ :time xcb:Time:CurrentTime))
+ (xcb:flush exwm--connection)))
+
+(provide 'exwm-input)
+;;; exwm-input.el ends here
diff --git a/elpa/exwm-0.33/exwm-input.elc b/elpa/exwm-0.33/exwm-input.elc
new file mode 100644
index 0000000..c18222b
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-input.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-layout.el b/elpa/exwm-0.33/exwm-layout.el
new file mode 100644
index 0000000..ce53d32
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-layout.el
@@ -0,0 +1,618 @@
+;;; exwm-layout.el --- Layout Module for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 module is responsible for keeping X client window properly displayed.
+
+;;; Code:
+
+(require 'exwm-core)
+
+(defgroup exwm-layout nil
+ "Layout."
+ :group 'exwm)
+
+(defcustom exwm-layout-auto-iconify t
+ "Non-nil to automatically iconify unused X windows when possible."
+ :type 'boolean)
+
+(defcustom exwm-layout-show-all-buffers nil
+ "Non-nil to allow switching to buffers on other workspaces."
+ :type 'boolean)
+
+(defconst exwm-layout--floating-hidden-position -101
+ "Where to place hidden floating X windows.")
+
+(defvar exwm-layout--other-buffer-exclude-buffers nil
+ "List of buffers that should not be selected by `other-buffer'.")
+
+(defvar exwm-layout--other-buffer-exclude-exwm-mode-buffers nil
+ "When non-nil, prevent EXWM buffers from being selected by `other-buffer'.")
+
+(defvar exwm-layout--timer nil "Timer used to track echo area changes.")
+
+(defvar exwm-workspace--current)
+(defvar exwm-workspace--frame-y-offset)
+(declare-function exwm-input--release-keyboard "exwm-input.el")
+(declare-function exwm-input--grab-keyboard "exwm-input.el")
+(declare-function exwm-input-grab-keyboard "exwm-input.el")
+(declare-function exwm-workspace--active-p "exwm-workspace.el" (frame))
+(declare-function exwm-workspace--get-geometry "exwm-workspace.el" (frame))
+(declare-function exwm-workspace--minibuffer-own-frame-p "exwm-workspace.el")
+(declare-function exwm-workspace--workspace-p "exwm-workspace.el"
+ (workspace))
+(declare-function exwm-workspace-move-window "exwm-workspace.el"
+ (frame-or-index &optional id))
+
+(defun exwm-layout--set-state (id state)
+ "Set WM_STATE of X window ID to STATE."
+ (exwm--log "id=#x%x" id)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:icccm:set-WM_STATE
+ :window id :state state :icon xcb:Window:None))
+ (with-current-buffer (exwm--id->buffer id)
+ (setq exwm-state state)))
+
+(defun exwm-layout--iconic-state-p (&optional id)
+ "Check whether X window ID is in iconic state."
+ (= xcb:icccm:WM_STATE:IconicState
+ (if id
+ (buffer-local-value 'exwm-state (exwm--id->buffer id))
+ exwm-state)))
+
+(defun exwm-layout--set-ewmh-state (id)
+ "Set _NET_WM_STATE of X window ID to the value of variable `exwm--ewmh-state'."
+ (with-current-buffer (exwm--id->buffer id)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_STATE
+ :window exwm--id
+ :data exwm--ewmh-state))))
+
+(defun exwm-layout--fullscreen-p ()
+ "Check whether current `exwm-mode' buffer is in fullscreen state."
+ (when (derived-mode-p 'exwm-mode)
+ (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)))
+
+(defun exwm-layout--auto-iconify ()
+ "Helper function to iconify unused X windows.
+See variable `exwm-layout-auto-iconify'."
+ (when (and exwm-layout-auto-iconify
+ (not exwm-transient-for))
+ (let ((xwin exwm--id)
+ (state exwm-state))
+ (dolist (pair exwm--id-buffer-alist)
+ (with-current-buffer (cdr pair)
+ (when (and exwm--floating-frame
+ (eq exwm-transient-for xwin)
+ (not (eq exwm-state state)))
+ (if (eq state xcb:icccm:WM_STATE:NormalState)
+ (exwm-layout--refresh-floating exwm--floating-frame)
+ (exwm-layout--hide exwm--id))))))))
+
+(defun exwm-layout--show (id &optional window)
+ "Show window ID exactly fit in the Emacs window WINDOW."
+ (exwm--log "Show #x%x in %s" id window)
+ (let* ((edges (window-inside-absolute-pixel-edges window))
+ (x (pop edges))
+ (y (pop edges))
+ (width (- (pop edges) x))
+ (height (- (pop edges) y))
+ frame-x frame-y frame-width frame-height)
+ (when (< emacs-major-version 31)
+ (setq y (+ y (window-tab-line-height window))))
+ (with-current-buffer (exwm--id->buffer id)
+ (when exwm--floating-frame
+ (setq frame-width (frame-pixel-width exwm--floating-frame)
+ frame-height (+ (frame-pixel-height exwm--floating-frame)
+ ;; Use `frame-outer-height' in the future.
+ exwm-workspace--frame-y-offset))
+ (when exwm--floating-frame-position
+ (setq frame-x (elt exwm--floating-frame-position 0)
+ frame-y (elt exwm--floating-frame-position 1)
+ x (+ x frame-x (- exwm-layout--floating-hidden-position))
+ y (+ y frame-y (- exwm-layout--floating-hidden-position)))
+ (setq exwm--floating-frame-position nil))
+ (exwm--set-geometry (frame-parameter exwm--floating-frame
+ 'exwm-container)
+ frame-x frame-y frame-width frame-height))
+ (when (exwm-layout--fullscreen-p)
+ (with-slots ((x* x)
+ (y* y)
+ (width* width)
+ (height* height))
+ (exwm-workspace--get-geometry exwm--frame)
+ (setq x x*
+ y y*
+ width width*
+ height height*)))
+ (exwm--set-geometry id x y width height)
+ (xcb:+request exwm--connection (make-instance 'xcb:MapWindow :window id))
+ (exwm-layout--set-state id xcb:icccm:WM_STATE:NormalState)
+ (setq exwm--ewmh-state
+ (delq xcb:Atom:_NET_WM_STATE_HIDDEN exwm--ewmh-state))
+ (exwm-layout--set-ewmh-state id)
+ (exwm-layout--auto-iconify)))
+ (xcb:flush exwm--connection))
+
+(defun exwm-layout--hide (id)
+ "Hide window ID."
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (or (exwm-layout--iconic-state-p)
+ (and exwm--floating-frame
+ exwm--desktop
+ (= 4294967295. exwm--desktop)))
+ (exwm--log "Hide #x%x" id)
+ (when exwm--floating-frame
+ (let* ((container (frame-parameter exwm--floating-frame
+ 'exwm-container))
+ (geometry (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry
+ :drawable container))))
+ (setq exwm--floating-frame-position
+ (vector (slot-value geometry 'x) (slot-value geometry 'y)))
+ (exwm--set-geometry container exwm-layout--floating-hidden-position
+ exwm-layout--floating-hidden-position
+ 1
+ 1)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window id :value-mask xcb:CW:EventMask
+ :event-mask xcb:EventMask:NoEvent))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UnmapWindow :window id))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window id :value-mask xcb:CW:EventMask
+ :event-mask (exwm--get-client-event-mask)))
+ (exwm-layout--set-state id xcb:icccm:WM_STATE:IconicState)
+ (cl-pushnew xcb:Atom:_NET_WM_STATE_HIDDEN exwm--ewmh-state)
+ (exwm-layout--set-ewmh-state id)
+ (exwm-layout--auto-iconify)
+ (xcb:flush exwm--connection))))
+
+(cl-defun exwm-layout-set-fullscreen (&optional id)
+ "Make window ID fullscreen."
+ (interactive)
+ (exwm--log "id=#x%x" (or id 0))
+ (unless (and (or id (derived-mode-p 'exwm-mode))
+ (not (exwm-layout--fullscreen-p)))
+ (cl-return-from exwm-layout-set-fullscreen))
+ (with-current-buffer (if id (exwm--id->buffer id) (window-buffer))
+ ;; Expand the X window to fill the whole screen.
+ (with-slots (x y width height) (exwm-workspace--get-geometry exwm--frame)
+ (exwm--set-geometry exwm--id x y width height))
+ ;; Raise the X window.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window exwm--id
+ :value-mask (logior xcb:ConfigWindow:BorderWidth
+ xcb:ConfigWindow:StackMode)
+ :border-width 0
+ :stack-mode xcb:StackMode:Above))
+ (cl-pushnew xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state)
+ (exwm-layout--set-ewmh-state exwm--id)
+ (xcb:flush exwm--connection)
+ (set-window-dedicated-p (get-buffer-window) t)
+ (exwm-input--release-keyboard exwm--id)))
+
+(cl-defun exwm-layout-unset-fullscreen (&optional id)
+ "Restore X window ID from fullscreen state."
+ (interactive)
+ (exwm--log "id=#x%x" (or id 0))
+ (unless (and (or id (derived-mode-p 'exwm-mode))
+ (exwm-layout--fullscreen-p))
+ (cl-return-from exwm-layout-unset-fullscreen))
+ (with-current-buffer (if id (exwm--id->buffer id) (window-buffer))
+ ;; `exwm-layout--show' relies on `exwm--ewmh-state' to decide whether to
+ ;; fullscreen the window.
+ (setq exwm--ewmh-state
+ (delq xcb:Atom:_NET_WM_STATE_FULLSCREEN exwm--ewmh-state))
+ (exwm-layout--set-ewmh-state exwm--id)
+ (if exwm--floating-frame
+ (exwm-layout--show exwm--id (frame-root-window exwm--floating-frame))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window exwm--id
+ :value-mask (logior xcb:ConfigWindow:Sibling
+ xcb:ConfigWindow:StackMode)
+ :sibling exwm--guide-window
+ :stack-mode xcb:StackMode:Above))
+ (let ((window (get-buffer-window nil t)))
+ (when window
+ (exwm-layout--show exwm--id window))))
+ (xcb:flush exwm--connection)
+ (set-window-dedicated-p (get-buffer-window) nil)
+ (when (eq 'line-mode exwm--selected-input-mode)
+ (exwm-input--grab-keyboard exwm--id))))
+
+(defun exwm-layout-toggle-fullscreen (&optional id)
+ "Toggle fullscreen mode of X window ID.
+If ID is non-nil, default to ID of `window-buffer'."
+ (interactive)
+ (setq id (or id (exwm--buffer->id (current-buffer))
+ (user-error "Current buffer has no X window ID")))
+ (exwm--log "id=#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (if (exwm-layout--fullscreen-p)
+ (exwm-layout-unset-fullscreen id)
+ (exwm-layout-set-fullscreen id))))
+
+(defun exwm-layout--other-buffer-predicate (buffer)
+ "Return non-nil when the BUFFER may be displayed in selected frame.
+
+Prevents EXWM-mode buffers already being displayed on some other window from
+being selected.
+
+Should be set as `buffer-predicate' frame parameter for all
+frames. Used by `other-buffer'.
+
+When variable `exwm-layout--other-buffer-exclude-exwm-mode-buffers'
+is t EXWM buffers are never selected by `other-buffer'.
+
+When variable `exwm-layout--other-buffer-exclude-buffers' is a
+list of buffers, EXWM buffers belonging to that list are never
+selected by `other-buffer'."
+ (or (not (with-current-buffer buffer (derived-mode-p 'exwm-mode)))
+ (and (not exwm-layout--other-buffer-exclude-exwm-mode-buffers)
+ (not (memq buffer exwm-layout--other-buffer-exclude-buffers))
+ ;; Do not select if already shown in some window.
+ (not (get-buffer-window buffer t)))))
+
+(defun exwm-layout--set-client-list-stacking ()
+ "Set _NET_CLIENT_LIST_STACKING."
+ (exwm--log)
+ (let (id clients-floating clients clients-iconic clients-other)
+ (dolist (pair exwm--id-buffer-alist)
+ (setq id (car pair))
+ (with-current-buffer (cdr pair)
+ (if (eq exwm--frame exwm-workspace--current)
+ (if exwm--floating-frame
+ ;; A floating X window on the current workspace.
+ (setq clients-floating (cons id clients-floating))
+ (if (get-buffer-window (cdr pair) exwm-workspace--current)
+ ;; A normal tilling X window on the current workspace.
+ (setq clients (cons id clients))
+ ;; An iconic tilling X window on the current workspace.
+ (setq clients-iconic (cons id clients-iconic))))
+ ;; X window on other workspaces.
+ (setq clients-other (cons id clients-other)))))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_CLIENT_LIST_STACKING
+ :window exwm--root
+ :data (vconcat (append clients-other clients-iconic
+ clients clients-floating))))))
+
+(defun exwm-layout--refresh (&optional frame)
+ "Refresh layout of FRAME.
+If FRAME is nil, refresh layout of selected frame."
+ ;; `window-size-change-functions' sets this argument while
+ ;; `window-configuration-change-hook' makes the frame selected.
+ (unless frame
+ (setq frame (selected-frame)))
+ (exwm--log "frame=%s" frame)
+ (if (not (exwm-workspace--workspace-p frame))
+ (if (frame-parameter frame 'exwm-outer-id)
+ (exwm-layout--refresh-floating frame)
+ (exwm-layout--refresh-other frame))
+ (exwm-layout--refresh-workspace frame)))
+
+(defun exwm-layout--refresh-floating (frame)
+ "Refresh floating frame FRAME."
+ (exwm--log "Refresh floating %s" frame)
+ (let ((window (frame-first-window frame)))
+ (with-current-buffer (window-buffer window)
+ (when (and (derived-mode-p 'exwm-mode)
+ ;; It may be a buffer waiting to be killed.
+ (exwm--id->buffer exwm--id))
+ (exwm--log "Refresh floating window #x%x" exwm--id)
+ (if (exwm-workspace--active-p exwm--frame)
+ (exwm-layout--show exwm--id window)
+ (exwm-layout--hide exwm--id))))))
+
+(defun exwm-layout--refresh-other (frame)
+ "Refresh client or nox frame FRAME."
+ ;; Other frames (e.g. terminal/graphical frame of emacsclient)
+ ;; We shall bury all `exwm-mode' buffers in this case
+ (exwm--log "Refresh other %s" frame)
+ (let ((windows (window-list frame 'nomini)) ;exclude minibuffer
+ (exwm-layout--other-buffer-exclude-exwm-mode-buffers t))
+ (dolist (window windows)
+ (with-current-buffer (window-buffer window)
+ (when (derived-mode-p 'exwm-mode)
+ (if (window-prev-buffers window)
+ (switch-to-prev-buffer window)
+ (switch-to-next-buffer window)))))))
+
+(defun exwm-layout--refresh-workspace (frame)
+ "Refresh workspace frame FRAME."
+ (exwm--log "Refresh workspace %s" frame)
+ ;; Workspaces other than the active one can also be refreshed (RandR)
+ (let (covered-buffers ;EXWM-buffers covered by a new X window.
+ vacated-windows) ;Windows previously displaying EXWM-buffers.
+ (dolist (pair exwm--id-buffer-alist)
+ (with-current-buffer (cdr pair)
+ (when (and (not exwm--floating-frame) ;exclude floating X windows
+ (or exwm-layout-show-all-buffers
+ ;; Exclude X windows on other workspaces
+ (eq frame exwm--frame)))
+ (let (;; List of windows in current frame displaying the `exwm-mode'
+ ;; buffers.
+ (windows (get-buffer-window-list (current-buffer) 'nomini
+ frame)))
+ (if (not windows)
+ (when (eq frame exwm--frame)
+ ;; Hide it if it was being shown in this workspace.
+ (exwm-layout--hide exwm--id))
+ (let ((window (car windows)))
+ (if (eq frame exwm--frame)
+ ;; Show it if `frame' is active, hide otherwise.
+ (if (exwm-workspace--active-p frame)
+ (exwm-layout--show exwm--id window)
+ (exwm-layout--hide exwm--id))
+ ;; It was last shown in other workspace; move it here.
+ (exwm-workspace-move-window frame exwm--id))
+ ;; Vacate any other windows (in any workspace) showing this
+ ;; `exwm-mode' buffer.
+ (setq vacated-windows
+ (append vacated-windows (remove
+ window
+ (get-buffer-window-list
+ (current-buffer) 'nomini t))))
+ ;; Note any `exwm-mode' buffer is being covered by another
+ ;; `exwm-mode' buffer. We want to avoid that `exwm-mode'
+ ;; buffer to be reappear in any of the vacated windows.
+ (let ((prev-buffer (car-safe
+ (car-safe (window-prev-buffers window)))))
+ (and
+ prev-buffer
+ (buffer-live-p prev-buffer)
+ (with-current-buffer prev-buffer
+ (derived-mode-p 'exwm-mode))
+ (push prev-buffer covered-buffers)))))))))
+ ;; Set some sensible buffer to vacated windows.
+ (let ((exwm-layout--other-buffer-exclude-buffers covered-buffers))
+ (dolist (window vacated-windows)
+ (if (window-prev-buffers window)
+ (switch-to-prev-buffer window)
+ (switch-to-next-buffer window))))
+ ;; Make sure windows floating / on other workspaces are excluded
+ (let ((exwm-layout--other-buffer-exclude-exwm-mode-buffers t))
+ (dolist (window (window-list frame 'nomini))
+ (with-current-buffer (window-buffer window)
+ (when (and (derived-mode-p 'exwm-mode)
+ (or exwm--floating-frame (not (eq frame exwm--frame))))
+ (if (window-prev-buffers window)
+ (switch-to-prev-buffer window)
+ (switch-to-next-buffer window))))))
+ (exwm-layout--set-client-list-stacking)
+ (xcb:flush exwm--connection)))
+
+(defun exwm-layout--on-minibuffer-setup ()
+ "Refresh layout when minibuffer grows."
+ (exwm--log)
+ ;; Only when active minibuffer's frame is an EXWM frame.
+ (let* ((mini-window (active-minibuffer-window))
+ (frame (window-frame mini-window)))
+ (when (exwm-workspace--workspace-p frame)
+ (exwm--defer 0 (lambda ()
+ (when (< 1 (window-height mini-window))
+ (exwm-layout--refresh frame)))))))
+
+(defun exwm-layout--on-echo-area-change (&optional dirty)
+ "Run when message arrives or in `echo-area-clear-hook' to refresh layout.
+If DIRTY is non-nil, refresh layout immediately."
+ (let ((frame (window-frame (active-minibuffer-window)))
+ (msg (current-message)))
+ ;; Check whether the frame where current window's minibuffer resides (not
+ ;; current window's frame for floating windows!) must be adjusted.
+ (when (and msg
+ (exwm-workspace--workspace-p frame)
+ (or (cl-position ?\n msg)
+ (> (length msg) (frame-width frame))))
+ (exwm--log)
+ (if dirty
+ (exwm-layout--refresh exwm-workspace--current)
+ (exwm--defer 0 #'exwm-layout--refresh exwm-workspace--current)))))
+
+(defun exwm-layout-enlarge-window (delta &optional horizontal)
+ "Make the selected window DELTA pixels taller.
+
+If no argument is given, make the selected window one pixel taller. If the
+optional argument HORIZONTAL is non-nil, make selected window DELTA pixels
+wider. If DELTA is negative, shrink selected window by -DELTA pixels.
+
+Normal hints are checked and regarded if the selected window is displaying an
+`exwm-mode' buffer. However, this may violate the normal hints set on other X
+windows."
+ (interactive "p")
+ (exwm--log)
+ (cond
+ ((zerop delta)) ;no operation
+ ((window-minibuffer-p)) ;avoid resize minibuffer-window
+ ((not (and (derived-mode-p 'exwm-mode) exwm--floating-frame))
+ ;; Resize on tiling layout
+ (unless (= 0 (window-resizable nil delta horizontal nil t)) ;not resizable
+ (let ((window-resize-pixelwise t))
+ (window-resize nil delta horizontal nil t))))
+ ;; Resize on floating layout
+ (exwm--fixed-size) ;fixed size
+ (horizontal
+ (let* ((width (frame-pixel-width))
+ (edges (window-inside-pixel-edges))
+ (inner-width (- (elt edges 2) (elt edges 0)))
+ (margin (- width inner-width)))
+ (if (> delta 0)
+ (if (not exwm--normal-hints-max-width)
+ (cl-incf width delta)
+ (if (>= inner-width exwm--normal-hints-max-width)
+ (setq width nil)
+ (setq width (min (+ exwm--normal-hints-max-width margin)
+ (+ width delta)))))
+ (if (not exwm--normal-hints-min-width)
+ (cl-incf width delta)
+ (if (<= inner-width exwm--normal-hints-min-width)
+ (setq width nil)
+ (setq width (max (+ exwm--normal-hints-min-width margin)
+ (+ width delta))))))
+ (when (and width (> width 0))
+ (setf (slot-value exwm--geometry 'width) width)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm--floating-frame
+ 'exwm-outer-id)
+ :value-mask xcb:ConfigWindow:Width
+ :width width))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm--floating-frame
+ 'exwm-container)
+ :value-mask xcb:ConfigWindow:Width
+ :width width))
+ (xcb:flush exwm--connection))))
+ (t
+ (let* ((height (+ (frame-pixel-height) exwm-workspace--frame-y-offset))
+ (edges (window-inside-pixel-edges))
+ (inner-height (- (elt edges 3) (elt edges 1)))
+ (margin (- height inner-height)))
+ (if (> delta 0)
+ (if (not exwm--normal-hints-max-height)
+ (cl-incf height delta)
+ (if (>= inner-height exwm--normal-hints-max-height)
+ (setq height nil)
+ (setq height (min (+ exwm--normal-hints-max-height margin)
+ (+ height delta)))))
+ (if (not exwm--normal-hints-min-height)
+ (cl-incf height delta)
+ (if (<= inner-height exwm--normal-hints-min-height)
+ (setq height nil)
+ (setq height (max (+ exwm--normal-hints-min-height margin)
+ (+ height delta))))))
+ (when (and height (> height 0))
+ (setf (slot-value exwm--geometry 'height) height)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm--floating-frame
+ 'exwm-outer-id)
+ :value-mask xcb:ConfigWindow:Height
+ :height height))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm--floating-frame
+ 'exwm-container)
+ :value-mask xcb:ConfigWindow:Height
+ :height height))
+ (xcb:flush exwm--connection))))))
+
+(defun exwm-layout-enlarge-window-horizontally (delta)
+ "Make the selected window DELTA pixels wider.
+
+See also `exwm-layout-enlarge-window'."
+ (interactive "p")
+ (exwm--log "%s" delta)
+ (exwm-layout-enlarge-window delta t))
+
+(defun exwm-layout-shrink-window (delta)
+ "Make the selected window DELTA pixels lower.
+
+See also `exwm-layout-enlarge-window'."
+ (interactive "p")
+ (exwm--log "%s" delta)
+ (exwm-layout-enlarge-window (- delta)))
+
+(defun exwm-layout-shrink-window-horizontally (delta)
+ "Make the selected window DELTA pixels narrower.
+
+See also `exwm-layout-enlarge-window'."
+ (interactive "p")
+ (exwm--log "%s" delta)
+ (exwm-layout-enlarge-window (- delta) t))
+
+(defun exwm-layout-hide-mode-line ()
+ "Hide mode-line."
+ (interactive)
+ (exwm--log)
+ (when (and (derived-mode-p 'exwm-mode) mode-line-format)
+ (let (mode-line-height)
+ (when exwm--floating-frame
+ (setq mode-line-height (window-mode-line-height
+ (frame-root-window exwm--floating-frame))))
+ (setq exwm--mode-line-format mode-line-format
+ mode-line-format nil)
+ (if (not exwm--floating-frame)
+ (exwm-layout--show exwm--id)
+ (set-frame-height exwm--floating-frame
+ (- (frame-pixel-height exwm--floating-frame)
+ mode-line-height)
+ nil t)))))
+
+(defun exwm-layout-show-mode-line ()
+ "Show mode-line."
+ (interactive)
+ (exwm--log)
+ (when (and (derived-mode-p 'exwm-mode) (not mode-line-format))
+ (setq mode-line-format exwm--mode-line-format
+ exwm--mode-line-format nil)
+ (if (not exwm--floating-frame)
+ (exwm-layout--show exwm--id)
+ (set-frame-height exwm--floating-frame
+ (+ (frame-pixel-height exwm--floating-frame)
+ (window-mode-line-height (frame-root-window
+ exwm--floating-frame)))
+ nil t)
+ (call-interactively #'exwm-input-grab-keyboard))
+ (force-mode-line-update)))
+
+(defun exwm-layout-toggle-mode-line ()
+ "Toggle the display of mode-line."
+ (interactive)
+ (exwm--log)
+ (when (derived-mode-p 'exwm-mode)
+ (if mode-line-format
+ (exwm-layout-hide-mode-line)
+ (exwm-layout-show-mode-line))))
+
+(defun exwm-layout--init ()
+ "Initialize layout module."
+ ;; Auto refresh layout
+ (exwm--log)
+ (add-hook 'window-configuration-change-hook #'exwm-layout--refresh)
+ (add-hook 'window-size-change-functions #'exwm-layout--refresh)
+ (unless (exwm-workspace--minibuffer-own-frame-p)
+ ;; Refresh when minibuffer grows
+ (add-hook 'minibuffer-setup-hook #'exwm-layout--on-minibuffer-setup t)
+ (setq exwm-layout--timer
+ (run-with-idle-timer 0 t #'exwm-layout--on-echo-area-change t))
+ (add-hook 'echo-area-clear-hook #'exwm-layout--on-echo-area-change)))
+
+(defun exwm-layout--exit ()
+ "Exit the layout module."
+ (exwm--log)
+ (remove-hook 'window-configuration-change-hook #'exwm-layout--refresh)
+ (remove-hook 'window-size-change-functions #'exwm-layout--refresh)
+ (remove-hook 'minibuffer-setup-hook #'exwm-layout--on-minibuffer-setup)
+ (when exwm-layout--timer
+ (cancel-timer exwm-layout--timer)
+ (setq exwm-layout--timer nil))
+ (remove-hook 'echo-area-clear-hook #'exwm-layout--on-echo-area-change))
+
+(provide 'exwm-layout)
+;;; exwm-layout.el ends here
diff --git a/elpa/exwm-0.33/exwm-layout.elc b/elpa/exwm-0.33/exwm-layout.elc
new file mode 100644
index 0000000..68d64b3
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-layout.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-manage.el b/elpa/exwm-0.33/exwm-manage.el
new file mode 100644
index 0000000..14023ab
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-manage.el
@@ -0,0 +1,830 @@
+;;; exwm-manage.el --- Window Management Module for -*- lexical-binding: t -*-
+;;; EXWM
+
+;; Copyright (C) 2015-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 is the fundamental module of EXWM that deals with window management.
+
+;;; Code:
+
+(require 'exwm-core)
+
+(defgroup exwm-manage nil
+ "Manage."
+ :group 'exwm)
+
+(defcustom exwm-manage-finish-hook nil
+ "Normal hook run after a window is just managed.
+This hook runs in the context of the corresponding `exwm-mode' buffer."
+ :type 'hook)
+
+(defcustom exwm-manage-force-tiling nil
+ "Non-nil to force managing all X windows in tiling layout.
+You can still make the X windows floating afterwards."
+ :type 'boolean)
+
+(defcustom exwm-manage-ping-timeout 3
+ "Seconds to wait before killing a client."
+ :type 'integer)
+
+(defcustom exwm-manage-configurations nil
+ "Per-application configurations.
+
+Configuration options allow to override various default behaviors of EXWM
+and only take effect when they are present. Note for certain options
+specifying nil is not exactly the same as leaving them out. Currently
+possible choices:
+* floating: Force floating (non-nil) or tiling (nil) on startup.
+* x/y/width/height: Override the initial geometry (floating X window only).
+* border-width: Override the border width (only visible when floating).
+* fullscreen: Force full screen (non-nil) on startup.
+* floating-mode-line: `mode-line-format' used when floating.
+* tiling-mode-line: `mode-line-format' used when tiling.
+* floating-header-line: `header-line-format' used when floating.
+* tiling-header-line: `header-line-format' used when tiling.
+* char-mode: Force char-mode (non-nil) on startup.
+* prefix-keys: `exwm-input-prefix-keys' local to this X window.
+* simulation-keys: `exwm-input-simulation-keys' local to this X window.
+* workspace: The initial workspace.
+* managed: Force to manage (non-nil) or not manage (nil) the X window.
+
+For each X window managed for the first time, matching criteria (sexps) are
+evaluated sequentially and the first configuration with a non-nil matching
+criterion would be applied. Apart from generic forms, one would typically
+want to match against EXWM internal variables such as `exwm-title',
+`exwm-class-name' and `exwm-instance-name'."
+ :type '(alist :key-type (sexp :tag "Matching criterion" nil)
+ :value-type
+ (plist :tag "Configurations"
+ :options
+ (((const :tag "Floating" floating) boolean)
+ ((const :tag "X" x) number)
+ ((const :tag "Y" y) number)
+ ((const :tag "Width" width) number)
+ ((const :tag "Height" height) number)
+ ((const :tag "Border width" border-width) integer)
+ ((const :tag "Fullscreen" fullscreen) boolean)
+ ((const :tag "Floating mode-line" floating-mode-line)
+ sexp)
+ ((const :tag "Tiling mode-line" tiling-mode-line) sexp)
+ ((const :tag "Floating header-line"
+ floating-header-line)
+ sexp)
+ ((const :tag "Tiling header-line" tiling-header-line)
+ sexp)
+ ((const :tag "Char-mode" char-mode) boolean)
+ ((const :tag "Prefix keys" prefix-keys)
+ (repeat key-sequence))
+ ((const :tag "Simulation keys" simulation-keys)
+ (alist :key-type (key-sequence :tag "From")
+ :value-type (key-sequence :tag "To")))
+ ((const :tag "Workspace" workspace) integer)
+ ((const :tag "Managed" managed) boolean)
+ ;; For forward compatibility.
+ ((other) sexp))))
+ ;; TODO: This is admittedly ugly. We'd be better off with an event type.
+ :get (lambda (symbol)
+ (mapcar (lambda (pair)
+ (let* ((match (car pair))
+ (config (cdr pair))
+ (prefix-keys (plist-get config 'prefix-keys)))
+ (when prefix-keys
+ (setq config (copy-tree config)
+ config (plist-put config 'prefix-keys
+ (mapcar (lambda (i)
+ (if (sequencep i)
+ i
+ (vector i)))
+ prefix-keys))))
+ (cons match config)))
+ (default-value symbol)))
+ :set (lambda (symbol value)
+ (set symbol
+ (mapcar (lambda (pair)
+ (let* ((match (car pair))
+ (config (cdr pair))
+ (prefix-keys (plist-get config 'prefix-keys)))
+ (when prefix-keys
+ (setq config (copy-tree config)
+ config (plist-put config 'prefix-keys
+ (mapcar (lambda (i)
+ (if (sequencep i)
+ (aref i 0)
+ i))
+ prefix-keys))))
+ (cons match config)))
+ value))))
+
+;; FIXME: Make the following values as small as possible.
+(defconst exwm-manage--height-delta-min 5)
+(defconst exwm-manage--width-delta-min 5)
+
+;; The _MOTIF_WM_HINTS atom (see <Xm/MwmUtil.h> for more details)
+;; It's currently only used in 'exwm-manage' module
+(defvar exwm-manage--_MOTIF_WM_HINTS nil "_MOTIF_WM_HINTS atom.")
+
+(defvar exwm-manage--desktop nil "The desktop X window.")
+
+(defvar exwm-manage--frame-outer-id-list nil
+ "List of window-outer-id's of all frames.")
+
+(defvar exwm-manage--ping-lock nil
+ "Non-nil indicates EXWM is pinging a window.")
+
+(defvar exwm-input--skip-buffer-list-update)
+(defvar exwm-input-prefix-keys)
+(defvar exwm-workspace--current)
+(defvar exwm-workspace--id-struts-alist)
+(defvar exwm-workspace--list)
+(defvar exwm-workspace--switch-history-outdated)
+(defvar exwm-workspace-current-index)
+(declare-function exwm--update-class "exwm.el" (id &optional force))
+(declare-function exwm--update-hints "exwm.el" (id &optional force))
+(declare-function exwm--update-normal-hints "exwm.el" (id &optional force))
+(declare-function exwm--update-protocols "exwm.el" (id &optional force))
+(declare-function exwm--update-struts "exwm.el" (id))
+(declare-function exwm--update-title "exwm.el" (id))
+(declare-function exwm--update-transient-for "exwm.el" (id &optional force))
+(declare-function exwm--update-desktop "exwm.el" (id &optional force))
+(declare-function exwm--update-window-type "exwm.el" (id &optional force))
+(declare-function exwm-floating--set-floating "exwm-floating.el" (id))
+(declare-function exwm-floating--unset-floating "exwm-floating.el" (id))
+(declare-function exwm-input-grab-keyboard "exwm-input.el" (&optional id))
+(declare-function exwm-input-release-keyboard "exwm-input.el" (&optional id))
+(declare-function exwm-input-set-local-simulation-keys "exwm-input.el")
+(declare-function exwm-layout--fullscreen-p "exwm-layout.el" ())
+(declare-function exwm-layout--iconic-state-p "exwm-layout.el" (&optional id))
+(declare-function exwm-layout-set-fullscreen "exwm-layout.el" (&optional id))
+(declare-function exwm-workspace--get-geometry "exwm-workspace.el" (frame))
+(declare-function exwm-workspace--position "exwm-workspace.el" (frame))
+(declare-function exwm-workspace--set-fullscreen "exwm-workspace.el" (frame))
+(declare-function exwm-workspace--update-struts "exwm-workspace.el" ())
+(declare-function exwm-workspace--update-workareas "exwm-workspace.el" ())
+(declare-function exwm-workspace--workarea "exwm-workspace.el" (frame))
+
+(defun exwm-manage--update-geometry (id &optional force)
+ "Update geometry of X window ID.
+Override current geometry if FORCE is non-nil."
+ (exwm--log "id=#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (and exwm--geometry (not force))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry :drawable id))))
+ (setq exwm--geometry
+ (or reply
+ ;; Provide a reasonable fallback value.
+ (make-instance 'xcb:RECTANGLE
+ :x 0
+ :y 0
+ :width (/ (x-display-pixel-width) 2)
+ :height (/ (x-display-pixel-height) 2))))))))
+
+(defun exwm-manage--update-ewmh-state (id)
+ "Update _NET_WM_STATE of X window ID."
+ (exwm--log "id=#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless exwm--ewmh-state
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:ewmh:get-_NET_WM_STATE
+ :window id))))
+ (when reply
+ (setq exwm--ewmh-state (append (slot-value reply 'value) nil)))))))
+
+(defun exwm-manage--update-mwm-hints (id &optional force)
+ "Update _MOTIF_WM_HINTS of X window ID.
+Override current hinds if FORCE is non-nil."
+ (exwm--log "id=#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (and (not exwm--mwm-hints-decorations) (not force))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:icccm:-GetProperty
+ :window id
+ :property exwm-manage--_MOTIF_WM_HINTS
+ :type exwm-manage--_MOTIF_WM_HINTS
+ :long-length 5))))
+ (when reply
+ ;; Check MotifWmHints.decorations.
+ (with-slots (value) reply
+ (setq value (append value nil))
+ (when (and value
+ ;; See <Xm/MwmUtil.h> for fields definitions.
+ (/= 0 (logand
+ (elt value 0) ;MotifWmHints.flags
+ 2)) ;MWM_HINTS_DECORATIONS
+ (= 0
+ (elt value 2))) ;MotifWmHints.decorations
+ (setq exwm--mwm-hints-decorations nil))))))))
+
+(defun exwm-manage--update-default-directory (id)
+ "Update the `default-directory' of X window ID.
+Sets the `default-directory' of the EXWM buffer associated with X window to
+match its current working directory.
+
+This only works when procfs is mounted, which may not be the case on some BSDs."
+ (with-current-buffer (exwm--id->buffer id)
+ (if-let* ((response (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:ewmh:get-_NET_WM_PID
+ :window id)))
+ (pid (slot-value response 'value))
+ (cwd (file-symlink-p (format "/proc/%d/cwd" pid)))
+ ((file-accessible-directory-p cwd)))
+ (setq default-directory (file-name-as-directory cwd))
+ (setq default-directory (expand-file-name "~/")))))
+
+
+(defun exwm-manage--set-client-list ()
+ "Set _NET_CLIENT_LIST."
+ (exwm--log)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_CLIENT_LIST
+ :window exwm--root
+ :data (vconcat (mapcar #'car exwm--id-buffer-alist)))))
+
+(cl-defun exwm-manage--get-configurations ()
+ "Retrieve configurations for this buffer."
+ (exwm--log)
+ (when (derived-mode-p 'exwm-mode)
+ (dolist (i exwm-manage-configurations)
+ (save-current-buffer
+ (when (with-demoted-errors "Problematic configuration: %S"
+ (eval (car i) t))
+ (cl-return-from exwm-manage--get-configurations (cdr i)))))))
+
+(defun exwm-manage--manage-window (id)
+ "Manage window ID."
+ (exwm--log "Try to manage #x%x" id)
+ (catch 'return
+ ;; Ensure it's alive
+ (when (xcb:+request-checked+request-check exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window id :value-mask xcb:CW:EventMask
+ :event-mask (exwm--get-client-event-mask)))
+ (throw 'return 'dead))
+ ;; Add this X window to save-set.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeSaveSet
+ :mode xcb:SetMode:Insert
+ :window id))
+ (with-current-buffer (let ((exwm-input--skip-buffer-list-update t))
+ (generate-new-buffer "*EXWM*"))
+ ;; Keep the oldest X window first.
+ (setq exwm--id-buffer-alist
+ (nconc exwm--id-buffer-alist `((,id . ,(current-buffer)))))
+ (exwm-mode)
+ (setq exwm--id id
+ exwm--frame exwm-workspace--current)
+ (exwm--update-window-type id)
+ (exwm--update-class id)
+ (exwm--update-transient-for id)
+ (exwm--update-normal-hints id)
+ (exwm--update-hints id)
+ (exwm-manage--update-geometry id)
+ (exwm-manage--update-mwm-hints id)
+ (exwm--update-title id)
+ (exwm--update-protocols id)
+ (setq exwm--configurations (exwm-manage--get-configurations))
+ ;; OverrideRedirect is not checked here.
+ (when (and
+ ;; The user has specified to manage it.
+ (not (plist-get exwm--configurations 'managed))
+ (or
+ ;; The user has specified not to manage it.
+ (plist-member exwm--configurations 'managed)
+ ;; This is not a type of X window we can manage.
+ (and exwm-window-type
+ (not (cl-intersection
+ exwm-window-type
+ (list xcb:Atom:_NET_WM_WINDOW_TYPE_UTILITY
+ xcb:Atom:_NET_WM_WINDOW_TYPE_DIALOG
+ xcb:Atom:_NET_WM_WINDOW_TYPE_NORMAL))))
+ ;; Check the _MOTIF_WM_HINTS property to not manage floating X
+ ;; windows without decoration.
+ (and (not exwm--mwm-hints-decorations)
+ (not exwm--hints-input)
+ ;; Floating windows only
+ (or exwm-transient-for exwm--fixed-size
+ (memq xcb:Atom:_NET_WM_WINDOW_TYPE_UTILITY
+ exwm-window-type)
+ (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DIALOG
+ exwm-window-type)))))
+ (exwm--log "No need to manage #x%x" id)
+ ;; Update struts.
+ (when (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DOCK exwm-window-type)
+ (exwm--update-struts id))
+ ;; Remove all events
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window id :value-mask xcb:CW:EventMask
+ :event-mask
+ (if (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DOCK
+ exwm-window-type)
+ ;; Listen for PropertyChange (struts) and
+ ;; UnmapNotify/DestroyNotify event of the dock.
+ (exwm--get-client-event-mask)
+ xcb:EventMask:NoEvent)))
+ ;; The window needs to be mapped
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:MapWindow :window id))
+ (with-slots (x y width height) exwm--geometry
+ ;; Center window of type _NET_WM_WINDOW_TYPE_SPLASH
+ (when (memq xcb:Atom:_NET_WM_WINDOW_TYPE_SPLASH exwm-window-type)
+ (with-slots ((x* x) (y* y) (width* width) (height* height))
+ (exwm-workspace--workarea exwm--frame)
+ (exwm--set-geometry id
+ (+ x* (/ (- width* width) 2))
+ (+ y* (/ (- height* height) 2))
+ nil
+ nil))))
+ ;; Check for desktop.
+ (when (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DESKTOP exwm-window-type)
+ ;; There should be only one desktop X window.
+ (setq exwm-manage--desktop id)
+ ;; Put it at bottom.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window id
+ :value-mask xcb:ConfigWindow:StackMode
+ :stack-mode xcb:StackMode:Below)))
+ (xcb:flush exwm--connection)
+ (setq exwm--id-buffer-alist (assq-delete-all id exwm--id-buffer-alist))
+ (let ((kill-buffer-query-functions nil)
+ (exwm-input--skip-buffer-list-update t))
+ (kill-buffer (current-buffer)))
+ (throw 'return 'ignored))
+ (let ((index (plist-get exwm--configurations 'workspace)))
+ (when (and index (< index (length exwm-workspace--list)))
+ (setq exwm--frame (elt exwm-workspace--list index))))
+ ;; Manage the window
+ (exwm--log "Manage #x%x" id)
+ (xcb:+request exwm--connection ;remove border
+ (make-instance 'xcb:ConfigureWindow
+ :window id :value-mask xcb:ConfigWindow:BorderWidth
+ :border-width 0))
+ (dolist (button ;grab buttons to set focus / move / resize
+ (list xcb:ButtonIndex:1 xcb:ButtonIndex:2 xcb:ButtonIndex:3))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:GrabButton
+ :owner-events 0 :grab-window id
+ :event-mask xcb:EventMask:ButtonPress
+ :pointer-mode xcb:GrabMode:Sync
+ :keyboard-mode xcb:GrabMode:Async
+ :confine-to xcb:Window:None :cursor xcb:Cursor:None
+ :button button :modifiers xcb:ModMask:Any)))
+ (exwm-manage--set-client-list)
+ (xcb:flush exwm--connection)
+ (if (plist-member exwm--configurations 'floating)
+ ;; User has specified whether it should be floating.
+ (if (plist-get exwm--configurations 'floating)
+ (exwm-floating--set-floating id)
+ (with-selected-window (frame-selected-window exwm--frame)
+ (exwm-floating--unset-floating id)))
+ ;; Try to determine if it should be floating.
+ (if (and (not exwm-manage-force-tiling)
+ (or exwm-transient-for exwm--fixed-size
+ (memq xcb:Atom:_NET_WM_WINDOW_TYPE_UTILITY
+ exwm-window-type)
+ (memq xcb:Atom:_NET_WM_WINDOW_TYPE_DIALOG
+ exwm-window-type)))
+ (exwm-floating--set-floating id)
+ (with-selected-window (frame-selected-window exwm--frame)
+ (exwm-floating--unset-floating id))))
+ (if (plist-get exwm--configurations 'char-mode)
+ (exwm-input-release-keyboard id)
+ (exwm-input-grab-keyboard id))
+ (when-let* ((simulation-keys (plist-get exwm--configurations 'simulation-keys)))
+ (exwm-input-set-local-simulation-keys simulation-keys))
+ (when-let* ((prefix-keys (plist-get exwm--configurations 'prefix-keys)))
+ (setq-local exwm-input-prefix-keys prefix-keys))
+ (setq exwm-workspace--switch-history-outdated t)
+ (exwm--update-desktop id)
+ (exwm-manage--update-ewmh-state id)
+ (exwm-manage--update-default-directory id)
+ (when (or (plist-get exwm--configurations 'fullscreen)
+ (exwm-layout--fullscreen-p))
+ (setq exwm--ewmh-state (delq xcb:Atom:_NET_WM_STATE_FULLSCREEN
+ exwm--ewmh-state))
+ (exwm-layout-set-fullscreen id))
+ (run-hooks 'exwm-manage-finish-hook))))
+
+(defun exwm-manage--unmanage-window (id &optional withdraw-only)
+ "Unmanage window ID.
+
+If WITHDRAW-ONLY is non-nil, the X window will be properly placed back to the
+root window. Set WITHDRAW-ONLY to `quit' if this functions is used when window
+manager is shutting down."
+ (let ((buffer (exwm--id->buffer id)))
+ (exwm--log "Unmanage #x%x (buffer: %s, widthdraw: %s)"
+ id buffer withdraw-only)
+ (setq exwm--id-buffer-alist (assq-delete-all id exwm--id-buffer-alist))
+ ;; Update workspaces when a dock is destroyed.
+ (when (and (null withdraw-only)
+ (assq id exwm-workspace--id-struts-alist))
+ (setq exwm-workspace--id-struts-alist
+ (assq-delete-all id exwm-workspace--id-struts-alist))
+ (exwm-workspace--update-struts)
+ (exwm-workspace--update-workareas)
+ (dolist (f exwm-workspace--list)
+ (exwm-workspace--set-fullscreen f)))
+ (when (and (buffer-live-p buffer)
+ ;; Invoked from `exwm-manage--exit' upon disconnection.
+ (slot-value exwm--connection 'connected))
+ (with-current-buffer buffer
+ ;; Unmap the X window.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UnmapWindow :window id))
+ ;;
+ (setq exwm-workspace--switch-history-outdated t)
+ ;;
+ (when withdraw-only
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window id :value-mask xcb:CW:EventMask
+ :event-mask xcb:EventMask:NoEvent))
+ ;; Delete WM_STATE property
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:DeleteProperty
+ :window id :property xcb:Atom:WM_STATE))
+ (cond
+ ((eq withdraw-only 'quit)
+ ;; Remap the window when exiting.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:MapWindow :window id)))
+ (t
+ ;; Remove _NET_WM_DESKTOP.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:DeleteProperty
+ :window id
+ :property xcb:Atom:_NET_WM_DESKTOP)))))
+ (when exwm--floating-frame
+ ;; Unmap the floating frame before destroying its container.
+ (let ((window (frame-parameter exwm--floating-frame 'exwm-outer-id))
+ (container (frame-parameter exwm--floating-frame
+ 'exwm-container)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UnmapWindow :window window))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window window :parent exwm--root :x 0 :y 0))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:DestroyWindow :window container))))
+ (when (exwm-layout--fullscreen-p)
+ (let ((window (get-buffer-window)))
+ (when window
+ (set-window-dedicated-p window nil))))
+ (exwm-manage--set-client-list)
+ (xcb:flush exwm--connection))
+ (let ((kill-buffer-func
+ (lambda (buffer)
+ (when (buffer-local-value 'exwm--floating-frame buffer)
+ (select-window
+ (frame-selected-window exwm-workspace--current)))
+ (with-current-buffer buffer
+ (let ((kill-buffer-query-functions nil))
+ (kill-buffer buffer))))))
+ (exwm--defer 0 kill-buffer-func buffer)
+ (when (active-minibuffer-window)
+ (exit-minibuffer))))))
+
+(defun exwm-manage--scan ()
+ "Search for existing windows and try to manage them."
+ (exwm--log)
+ (let* ((tree (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:QueryTree
+ :window exwm--root)))
+ reply)
+ (dolist (i (slot-value tree 'children))
+ (setq reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetWindowAttributes
+ :window i)))
+ ;; It's possible the X window has been destroyed.
+ (when reply
+ (with-slots (override-redirect map-state) reply
+ (when (and (= 0 override-redirect)
+ (= xcb:MapState:Viewable map-state))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UnmapWindow
+ :window i))
+ (xcb:flush exwm--connection)
+ (exwm-manage--manage-window i)))))))
+
+(defun exwm-manage--kill-buffer-query-function ()
+ "Run in `kill-buffer-query-functions'."
+ (exwm--log "id=#x%x; buffer=%s" (or exwm--id 0) (current-buffer))
+ (catch 'return
+ (when (or (not exwm--connection)
+ (not (slot-value exwm--connection 'connected)))
+ (throw 'return t))
+ (when (or (not exwm--id)
+ (xcb:+request-checked+request-check exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window exwm--id
+ :value-mask xcb:CW:EventMask
+ :event-mask (exwm--get-client-event-mask))))
+ ;; The X window is no longer alive so just close the buffer.
+ (when exwm--floating-frame
+ (let ((window (frame-parameter exwm--floating-frame 'exwm-outer-id))
+ (container (frame-parameter exwm--floating-frame
+ 'exwm-container)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UnmapWindow :window window))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window window
+ :parent exwm--root
+ :x 0 :y 0))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:DestroyWindow
+ :window container))))
+ (xcb:flush exwm--connection)
+ (throw 'return t))
+ (unless (memq xcb:Atom:WM_DELETE_WINDOW exwm--protocols)
+ ;; The X window does not support WM_DELETE_WINDOW; destroy it.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:DestroyWindow :window exwm--id))
+ (xcb:flush exwm--connection)
+ ;; Wait for DestroyNotify event.
+ (throw 'return nil))
+ (let ((id exwm--id))
+ ;; Try to close the X window with WM_DELETE_WINDOW client message.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:icccm:SendEvent
+ :destination id
+ :event (xcb:marshal
+ (make-instance 'xcb:icccm:WM_DELETE_WINDOW
+ :window id)
+ exwm--connection)))
+ (xcb:flush exwm--connection)
+ ;;
+ (unless (memq xcb:Atom:_NET_WM_PING exwm--protocols)
+ ;; For X windows without _NET_WM_PING support, we'd better just
+ ;; wait for DestroyNotify events.
+ (throw 'return nil))
+ ;; Try to determine if the X window is dead with _NET_WM_PING.
+ (setq exwm-manage--ping-lock t)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination id
+ :event-mask xcb:EventMask:NoEvent
+ :event (xcb:marshal
+ (make-instance 'xcb:ewmh:_NET_WM_PING
+ :window id
+ :timestamp 0
+ :client-window id)
+ exwm--connection)))
+ (xcb:flush exwm--connection)
+ (with-timeout (exwm-manage-ping-timeout
+ (if (y-or-n-p (format "'%s' is not responding. \
+Would you like to kill it? "
+ (buffer-name)))
+ (progn (exwm-manage--kill-client id)
+ ;; Kill the unresponsive X window and
+ ;; wait for DestroyNotify event.
+ (throw 'return nil))
+ ;; Give up.
+ (throw 'return nil)))
+ (while (and exwm-manage--ping-lock
+ (exwm--id->buffer id)) ;may have been destroyed.
+ (accept-process-output nil 0.1))
+ ;; Give up.
+ (throw 'return nil)))))
+
+(defun exwm-manage--kill-client (&optional id)
+ "Kill X client ID.
+If ID is nil, kill X window corresponding to current buffer."
+ (unless id (setq id (exwm--buffer->id (current-buffer))))
+ (exwm--log "id=#x%x" id)
+ (let* ((response (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:ewmh:get-_NET_WM_PID :window id)))
+ (pid (and response (slot-value response 'value)))
+ (request (make-instance 'xcb:KillClient :resource id)))
+ (if (not pid)
+ (xcb:+request exwm--connection request)
+ ;; What if the PID is fake/wrong?
+ (signal-process pid 'SIGKILL)
+ ;; Ensure it's dead
+ (run-with-timer exwm-manage-ping-timeout nil
+ (lambda ()
+ (xcb:+request exwm--connection request))))
+ (xcb:flush exwm--connection)))
+
+(defun exwm-manage--add-frame (frame)
+ "Run in `after-make-frame-functions'.
+FRAME is the newly created frame."
+ (exwm--log "frame=%s" frame)
+ (when (display-graphic-p frame)
+ (push (string-to-number (frame-parameter frame 'outer-window-id))
+ exwm-manage--frame-outer-id-list)))
+
+(defun exwm-manage--remove-frame (frame)
+ "Run in `delete-frame-functions'.
+FRAME is the frame to be deleted."
+ (exwm--log "frame=%s" frame)
+ (when (display-graphic-p frame)
+ (setq exwm-manage--frame-outer-id-list
+ (delq (string-to-number (frame-parameter frame 'outer-window-id))
+ exwm-manage--frame-outer-id-list))))
+
+(defun exwm-manage--on-ConfigureRequest (data _synthetic)
+ "Handle ConfigureRequest event.
+DATA contains unmarshalled ConfigureRequest event data."
+ (exwm--log)
+ (let ((obj (make-instance 'xcb:ConfigureRequest))
+ buffer edges width-delta height-delta)
+ (xcb:unmarshal obj data)
+ (with-slots (window x y width height
+ border-width sibling stack-mode value-mask)
+ obj
+ (exwm--log "#x%x (#x%x) @%dx%d%+d%+d; \
+border-width: %d; sibling: #x%x; stack-mode: %d"
+ window value-mask width height x y
+ border-width sibling stack-mode)
+ (if (and (setq buffer (exwm--id->buffer window))
+ (with-current-buffer buffer
+ (or (exwm-layout--fullscreen-p)
+ ;; Make sure it's a floating X window wanting to resize
+ ;; itself.
+ (or (not exwm--floating-frame)
+ (progn
+ (setq edges
+ (window-inside-pixel-edges
+ (get-buffer-window buffer t))
+ width-delta (- width (- (elt edges 2)
+ (elt edges 0)))
+ height-delta (- height (- (elt edges 3)
+ (elt edges 1))))
+ ;; We cannot do resizing precisely for now.
+ (and (if (= 0 (logand value-mask
+ xcb:ConfigWindow:Width))
+ t
+ (< (abs width-delta)
+ exwm-manage--width-delta-min))
+ (if (= 0 (logand value-mask
+ xcb:ConfigWindow:Height))
+ t
+ (< (abs height-delta)
+ exwm-manage--height-delta-min))))))))
+ ;; Send client message for managed windows
+ (with-current-buffer buffer
+ (setq edges
+ (if (exwm-layout--fullscreen-p)
+ (with-slots (x y width height)
+ (exwm-workspace--get-geometry exwm--frame)
+ (list x y width height))
+ (window-inside-absolute-pixel-edges
+ (get-buffer-window buffer t))))
+ (exwm--log "Reply with ConfigureNotify (edges): %s" edges)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0 :destination window
+ :event-mask xcb:EventMask:StructureNotify
+ :event (xcb:marshal
+ (make-instance
+ 'xcb:ConfigureNotify
+ :event window :window window
+ :above-sibling xcb:Window:None
+ :x (elt edges 0) :y (elt edges 1)
+ :width (- (elt edges 2) (elt edges 0))
+ :height (- (elt edges 3) (elt edges 1))
+ :border-width 0 :override-redirect 0)
+ exwm--connection))))
+ (if buffer
+ (with-current-buffer buffer
+ (exwm--log "ConfigureWindow (resize floating X window)")
+ (exwm--set-geometry (frame-parameter exwm--floating-frame
+ 'exwm-outer-id)
+ nil
+ nil
+ (+ (frame-pixel-width exwm--floating-frame)
+ width-delta)
+ (+ (frame-pixel-height exwm--floating-frame)
+ height-delta)))
+ (exwm--log "ConfigureWindow (preserve geometry)")
+ ;; Configure the unmanaged window.
+ ;; But Emacs frames should be excluded. Generally we don't
+ ;; receive ConfigureRequest events from Emacs frames since we
+ ;; have set OverrideRedirect on them, but this is not true for
+ ;; Lucid build (as of 25.1).
+ (unless (memq window exwm-manage--frame-outer-id-list)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window window
+ :value-mask value-mask
+ :x x :y y :width width :height height
+ :border-width border-width
+ :sibling sibling
+ :stack-mode stack-mode)))))))
+ (xcb:flush exwm--connection))
+
+(defun exwm-manage--on-MapRequest (data _synthetic)
+ "Handle MapRequest event.
+DATA contains unmarshalled MapRequest event data."
+ (let ((obj (make-instance 'xcb:MapRequest)))
+ (xcb:unmarshal obj data)
+ (with-slots (parent window) obj
+ (exwm--log "id=#x%x parent=#x%x" window parent)
+ (if (assoc window exwm--id-buffer-alist)
+ (with-current-buffer (exwm--id->buffer window)
+ (if (exwm-layout--iconic-state-p)
+ ;; State change: iconic => normal.
+ (when (eq exwm--frame exwm-workspace--current)
+ (pop-to-buffer-same-window (current-buffer)))
+ (exwm--log "#x%x is already managed" window)))
+ (if (/= exwm--root parent)
+ (progn (xcb:+request exwm--connection
+ (make-instance 'xcb:MapWindow :window window))
+ (xcb:flush exwm--connection))
+ (exwm--log "#x%x" window)
+ (exwm-manage--manage-window window))))))
+
+(defun exwm-manage--on-UnmapNotify (data _synthetic)
+ "Handle UnmapNotify event.
+DATA contains unmarshalled UnmapNotify event data."
+ (let ((obj (make-instance 'xcb:UnmapNotify)))
+ (xcb:unmarshal obj data)
+ (with-slots (window) obj
+ (exwm--log "id=#x%x" window)
+ (exwm-manage--unmanage-window window t))))
+
+(defun exwm-manage--on-MapNotify (data _synthetic)
+ "Handle MapNotify event.
+DATA contains unmarshalled MapNotify event data."
+ (let ((obj (make-instance 'xcb:MapNotify)))
+ (xcb:unmarshal obj data)
+ (with-slots (window) obj
+ (when (assoc window exwm--id-buffer-alist)
+ (exwm--log "id=#x%x" window)
+ ;; With this we ensure that a "window hierarchy change" happens after
+ ;; mapping the window, as some servers (XQuartz) do not generate it.
+ (with-current-buffer (exwm--id->buffer window)
+ (if exwm--floating-frame
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window window
+ :value-mask xcb:ConfigWindow:StackMode
+ :stack-mode xcb:StackMode:Above))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window window
+ :value-mask (logior xcb:ConfigWindow:Sibling
+ xcb:ConfigWindow:StackMode)
+ :sibling exwm--guide-window
+ :stack-mode xcb:StackMode:Above))))
+ (xcb:flush exwm--connection)))))
+
+(defun exwm-manage--on-DestroyNotify (data synthetic)
+ "Handle DestroyNotify event.
+DATA contains unmarshalled DestroyNotify event data.
+SYNTHETIC indicates whether the event is a synthetic event."
+ (unless synthetic
+ (exwm--log)
+ (let ((obj (make-instance 'xcb:DestroyNotify)))
+ (xcb:unmarshal obj data)
+ (exwm--log "#x%x" (slot-value obj 'window))
+ (exwm-manage--unmanage-window (slot-value obj 'window)))))
+
+(defun exwm-manage--init ()
+ "Initialize manage module."
+ ;; Intern _MOTIF_WM_HINTS
+ (exwm--log)
+ (setq exwm-manage--_MOTIF_WM_HINTS (exwm--intern-atom "_MOTIF_WM_HINTS"))
+ (add-hook 'after-make-frame-functions #'exwm-manage--add-frame)
+ (add-hook 'delete-frame-functions #'exwm-manage--remove-frame)
+ (xcb:+event exwm--connection 'xcb:ConfigureRequest
+ #'exwm-manage--on-ConfigureRequest)
+ (xcb:+event exwm--connection 'xcb:MapRequest #'exwm-manage--on-MapRequest)
+ (xcb:+event exwm--connection 'xcb:UnmapNotify #'exwm-manage--on-UnmapNotify)
+ (xcb:+event exwm--connection 'xcb:MapNotify #'exwm-manage--on-MapNotify)
+ (xcb:+event exwm--connection 'xcb:DestroyNotify
+ #'exwm-manage--on-DestroyNotify))
+
+(defun exwm-manage--exit ()
+ "Exit the manage module."
+ (exwm--log)
+ (dolist (pair exwm--id-buffer-alist)
+ (exwm-manage--unmanage-window (car pair) 'quit))
+ (remove-hook 'after-make-frame-functions #'exwm-manage--add-frame)
+ (remove-hook 'delete-frame-functions #'exwm-manage--remove-frame)
+ (setq exwm-manage--_MOTIF_WM_HINTS nil))
+
+(provide 'exwm-manage)
+;;; exwm-manage.el ends here
diff --git a/elpa/exwm-0.33/exwm-manage.elc b/elpa/exwm-0.33/exwm-manage.elc
new file mode 100644
index 0000000..c191f36
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-manage.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-pkg.el b/elpa/exwm-0.33/exwm-pkg.el
new file mode 100644
index 0000000..224d972
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-pkg.el
@@ -0,0 +1,2 @@
+;; Generated package description from exwm.el -*- no-byte-compile: t -*-
+(define-package "exwm" "0.33" "Emacs X Window Manager" '((emacs "27.1") (xelb "0.20") (compat "30")) :commit "da034e67784a9e2600383e75606a6ade6925f374" :authors '(("Chris Feng" . "chris.w.feng@gmail.com")) :maintainer '(("Adrián Medraño Calvo" . "adrian@medranocalvo.com") ("Steven Allen" . "steven@stebalien.com") ("Daniel Mendler" . "mail@daniel-mendler.de")) :keywords '("unix") :url "https://github.com/emacs-exwm/exwm")
diff --git a/elpa/exwm-0.33/exwm-randr.el b/elpa/exwm-0.33/exwm-randr.el
new file mode 100644
index 0000000..17ae6b8
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-randr.el
@@ -0,0 +1,396 @@
+;;; exwm-randr.el --- RandR Module for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 module adds RandR support for EXWM. Currently it requires external
+;; tools such as xrandr(1) to properly configure RandR first. This
+;; dependency may be removed in the future, but more work is needed before
+;; that.
+
+;; To use this module, load, enable it and configure
+;; `exwm-randr-workspace-monitor-plist' and `exwm-randr-screen-change-hook'
+;; as follows:
+;;
+;; (setq exwm-randr-workspace-monitor-plist '(0 "VGA1"))
+;; (add-hook 'exwm-randr-screen-change-hook
+;; (lambda ()
+;; (start-process-shell-command
+;; "xrandr" nil "xrandr --output VGA1 --left-of LVDS1 --auto")))
+;; (exwm-randr-mode 1)
+;;
+;; With above lines, workspace 0 should be assigned to the output named "VGA1",
+;; staying at the left of other workspaces on the output "LVDS1". Please refer
+;; to xrandr(1) for the configuration of RandR.
+
+;; References:
+;; + RandR (http://www.x.org/archive/X11R7.7/doc/randrproto/randrproto.txt)
+
+;;; Code:
+
+(require 'xcb-randr)
+
+(require 'exwm-core)
+(require 'exwm-workspace)
+
+(declare-function x-get-atom-name "C source code" (VALUE &optional FRAME))
+
+(defgroup exwm-randr nil
+ "RandR."
+ :group 'exwm)
+
+(defvar exwm-randr--connection nil "The X connection.")
+
+(defcustom exwm-randr-refresh-hook nil
+ "Normal hook run when the RandR module just refreshed."
+ :type 'hook)
+
+(defcustom exwm-randr-screen-change-hook nil
+ "Normal hook run when screen changes."
+ :type 'hook)
+
+(defcustom exwm-randr-workspace-monitor-plist nil
+ "Plist mapping workspaces to monitors.
+
+In RandR 1.5 a monitor is a rectangle region decoupled from the physical
+size of screens, and can be identified with `xrandr --listmonitors' (name of
+the primary monitor is prefixed with an `*'). When no monitor is created it
+automatically fallback to RandR 1.2 output which represents the physical
+screen size. RandR 1.5 monitors can be created with `xrandr --setmonitor'.
+For example, to split an output (`LVDS-1') of size 1280x800 into two
+side-by-side monitors one could invoke (the digits after `/' are size in mm)
+
+ xrandr --setmonitor *LVDS-1-L 640/135x800/163+0+0 LVDS-1
+ xrandr --setmonitor LVDS-1-R 640/135x800/163+640+0 none
+
+If a monitor is not active, the workspaces mapped to it are displayed on the
+primary monitor until it becomes active (if ever). Unspecified workspaces
+are all mapped to the primary monitor. For example, with the following
+setting workspace other than 1 and 3 would always be displayed on the
+primary monitor where workspace 1 and 3 would be displayed on their
+corresponding monitors whenever the monitors are active.
+
+Changes to this variable only take immediate affect when set before
+`exwm-randr-mode' is enabled, via `setopt', or when customized (see the
+Info node `Customization'). Otherwise, the `exwm-randr-refresh' must be
+called explicitly to assign the correct workspaces to the correct monitors.
+
+ \\='(1 \"HDMI-1\" 3 \"DP-1\")"
+ :type '(plist :key-type integer :value-type string)
+ :initialize 'custom-initialize-changed
+ :set (lambda (symbol value)
+ (set-default-toplevel-value symbol value)
+ (when exwm-randr--connection
+ (exwm-randr-refresh))))
+
+(defvar exwm-randr--connection nil "The X connection.")
+
+(defvar exwm-randr--last-timestamp 0 "Used for debouncing events.")
+
+(defvar exwm-randr--prev-screen-change-timestamp 0
+ "The most recent ScreenChangeNotify config change timestamp.")
+
+(defvar exwm-randr--compatibility-mode nil
+ "Non-nil when the server does not support RandR 1.5 protocol.")
+
+;;;###autoload
+(define-minor-mode exwm-randr-mode
+ "Toggle EXWM randr support."
+ :global t
+ :group 'exwm-randr
+ (exwm--global-minor-mode-body randr))
+
+(defsubst exwm-randr--assert-connected ()
+ "Assert that `exwm-randr-mode' is enabled and activated."
+ (cond
+ ((not exwm-randr-mode) (user-error "EXWM RandR mode not enabled"))
+ ((not exwm-randr--connection) (user-error "EXWM RandR not connected, is EXWM running?"))))
+
+(defun exwm-randr--get-monitors ()
+ "Get RandR 1.5 monitors."
+ (exwm--log)
+ (let (monitor-name geometry monitor-geometry-alist primary-monitor)
+ (with-slots (timestamp monitors)
+ (xcb:+request-unchecked+reply exwm-randr--connection
+ (make-instance 'xcb:randr:GetMonitors
+ :window exwm--root
+ :get-active 1))
+ (when (> timestamp exwm-randr--last-timestamp)
+ (setq exwm-randr--last-timestamp timestamp))
+ (dolist (monitor monitors)
+ (with-slots (name primary x y width height) monitor
+ (setq monitor-name (x-get-atom-name name)
+ geometry (make-instance 'xcb:RECTANGLE
+ :x x
+ :y y
+ :width width
+ :height height)
+ monitor-geometry-alist (cons (cons monitor-name geometry)
+ monitor-geometry-alist))
+ (exwm--log "%s: %sx%s+%s+%s" monitor-name x y width height)
+ ;; Save primary monitor when available (fallback to the first one).
+ (when (or (/= 0 primary)
+ (not primary-monitor))
+ (setq primary-monitor monitor-name)))))
+ (exwm--log "Primary monitor: %s" primary-monitor)
+ (list primary-monitor monitor-geometry-alist
+ (exwm-randr--get-monitor-alias primary-monitor
+ monitor-geometry-alist))))
+
+(defun exwm-randr--get-outputs ()
+ "Get RandR 1.2 outputs.
+
+Only used when RandR 1.5 is not supported by the server."
+ (exwm--log)
+ (let (output-name geometry output-geometry-alist primary-output)
+ (with-slots (config-timestamp outputs)
+ (xcb:+request-unchecked+reply exwm-randr--connection
+ (make-instance 'xcb:randr:GetScreenResourcesCurrent
+ :window exwm--root))
+ (when (> config-timestamp exwm-randr--last-timestamp)
+ (setq exwm-randr--last-timestamp config-timestamp))
+ (dolist (output outputs)
+ (with-slots (crtc connection name)
+ (xcb:+request-unchecked+reply exwm-randr--connection
+ (make-instance 'xcb:randr:GetOutputInfo
+ :output output
+ :config-timestamp config-timestamp))
+ (when (and (= connection xcb:randr:Connection:Connected)
+ (/= crtc 0))
+ (with-slots (x y width height)
+ (xcb:+request-unchecked+reply exwm-randr--connection
+ (make-instance 'xcb:randr:GetCrtcInfo
+ :crtc crtc
+ :config-timestamp config-timestamp))
+ (setq output-name (decode-coding-string
+ (apply #'unibyte-string name) 'utf-8)
+ geometry (make-instance 'xcb:RECTANGLE
+ :x x
+ :y y
+ :width width
+ :height height)
+ output-geometry-alist (cons (cons output-name geometry)
+ output-geometry-alist))
+ (exwm--log "%s: %sx%s+%s+%s" output-name x y width height)
+ ;; The primary output is the first one.
+ (unless primary-output
+ (setq primary-output output-name)))))))
+ (exwm--log "Primary output: %s" primary-output)
+ (list primary-output output-geometry-alist
+ (exwm-randr--get-monitor-alias primary-output
+ output-geometry-alist))))
+
+(defun exwm-randr--get-monitor-alias (primary-monitor monitor-geometry-alist)
+ "Generate monitor aliases using PRIMARY-MONITOR MONITOR-GEOMETRY-ALIST.
+
+In a mirroring setup some monitors overlap and should be treated as one."
+ (let (monitor-position-alist monitor-alias-alist monitor-name geometry)
+ (setq monitor-position-alist (with-slots (x y)
+ (cdr (assoc primary-monitor
+ monitor-geometry-alist))
+ (list (cons primary-monitor (vector x y)))))
+ (setq monitor-alias-alist (list (cons primary-monitor primary-monitor)))
+ (dolist (pair monitor-geometry-alist)
+ (setq monitor-name (car pair)
+ geometry (cdr pair))
+ (unless (assoc monitor-name monitor-alias-alist)
+ (let* ((position (vector (slot-value geometry 'x)
+ (slot-value geometry 'y)))
+ (alias (car (rassoc position monitor-position-alist))))
+ (if alias
+ (setq monitor-alias-alist (cons (cons monitor-name alias)
+ monitor-alias-alist))
+ (setq monitor-position-alist (cons (cons monitor-name position)
+ monitor-position-alist)
+ monitor-alias-alist (cons (cons monitor-name monitor-name)
+ monitor-alias-alist))))))
+ monitor-alias-alist))
+
+(defun exwm-randr-refresh ()
+ "Refresh workspaces according to the updated RandR info."
+ (interactive)
+ (exwm--log)
+ (exwm-randr--assert-connected)
+ (let* ((result (if exwm-randr--compatibility-mode
+ (exwm-randr--get-outputs)
+ (exwm-randr--get-monitors)))
+ (primary-monitor (elt result 0))
+ (monitor-geometry-alist (elt result 1))
+ (monitor-alias-alist (elt result 2))
+ container-monitor-alist container-frame-alist)
+ (when (and primary-monitor monitor-geometry-alist)
+ (when exwm-workspace--fullscreen-frame-count
+ ;; Not all workspaces are fullscreen; reset this counter.
+ (setq exwm-workspace--fullscreen-frame-count 0))
+ (dotimes (i (exwm-workspace--count))
+ (let* ((monitor (plist-get exwm-randr-workspace-monitor-plist i))
+ (geometry (cdr (assoc monitor monitor-geometry-alist)))
+ (frame (elt exwm-workspace--list i))
+ (container (frame-parameter frame 'exwm-container)))
+ (if geometry
+ ;; Unify monitor names in case it's a mirroring setup.
+ (setq monitor (cdr (assoc monitor monitor-alias-alist)))
+ ;; Missing monitors fallback to the primary one.
+ (setq monitor primary-monitor
+ geometry (cdr (assoc primary-monitor
+ monitor-geometry-alist))))
+ (setq container-monitor-alist (nconc
+ `((,container . ,(intern monitor)))
+ container-monitor-alist)
+ container-frame-alist (nconc `((,container . ,frame))
+ container-frame-alist))
+ (set-frame-parameter frame 'exwm-randr-monitor monitor)
+ (set-frame-parameter frame 'exwm-geometry geometry)))
+ ;; Update workareas.
+ (exwm-workspace--update-workareas)
+ ;; Resize workspace.
+ (dolist (f exwm-workspace--list)
+ (exwm-workspace--set-fullscreen f))
+ (xcb:flush exwm-randr--connection)
+ ;; Raise the minibuffer if it's active.
+ (when (and (active-minibuffer-window)
+ (exwm-workspace--minibuffer-own-frame-p))
+ (exwm-workspace--show-minibuffer))
+ ;; Set _NET_DESKTOP_GEOMETRY.
+ (exwm-workspace--set-desktop-geometry)
+ ;; Update active/inactive workspaces.
+ (dolist (w exwm-workspace--list)
+ (exwm-workspace--set-active w nil))
+ ;; Mark the workspace on the top of each monitor as active.
+ (dolist (xwin
+ (reverse
+ (slot-value (xcb:+request-unchecked+reply exwm-randr--connection
+ (make-instance 'xcb:QueryTree
+ :window exwm--root))
+ 'children)))
+ (let ((monitor (cdr (assq xwin container-monitor-alist))))
+ (when monitor
+ (setq container-monitor-alist
+ (rassq-delete-all monitor container-monitor-alist))
+ (exwm-workspace--set-active (cdr (assq xwin container-frame-alist))
+ t))))
+ (xcb:flush exwm-randr--connection)
+ (run-hooks 'exwm-randr-refresh-hook))))
+
+(defun exwm-randr--on-ScreenChangeNotify (data _synthetic)
+ "Handle `ScreenChangeNotify' event with DATA.
+
+Run `exwm-randr-screen-change-hook' (usually user scripts to configure RandR)."
+ (exwm--log)
+ (let ((evt (make-instance 'xcb:randr:ScreenChangeNotify)))
+ (xcb:unmarshal evt data)
+ (let ((ts (slot-value evt 'config-timestamp)))
+ (unless (equal ts exwm-randr--prev-screen-change-timestamp)
+ (setq exwm-randr--prev-screen-change-timestamp ts)
+ (run-hooks 'exwm-randr-screen-change-hook)))))
+
+(defun exwm-randr--on-Notify (data _synthetic)
+ "Handle `CrtcChangeNotify' and `OutputChangeNotify' events with DATA.
+
+Refresh when any CRTC/output changes."
+ (exwm--log)
+ (let ((evt (make-instance 'xcb:randr:Notify))
+ notify)
+ (xcb:unmarshal evt data)
+ (with-slots (subCode u) evt
+ (cond ((= subCode xcb:randr:Notify:CrtcChange)
+ (setq notify (slot-value u 'cc)))
+ ((= subCode xcb:randr:Notify:OutputChange)
+ (setq notify (slot-value u 'oc))))
+ (when notify
+ (with-slots (timestamp) notify
+ (when (> timestamp exwm-randr--last-timestamp)
+ (exwm-randr-refresh)
+ (setq exwm-randr--last-timestamp timestamp)))))))
+
+(defun exwm-randr--on-ConfigureNotify (data _synthetic)
+ "Handle `ConfigureNotify' event with DATA.
+
+Refresh when any RandR 1.5 monitor changes."
+ (exwm--log)
+ (let ((evt (make-instance 'xcb:ConfigureNotify)))
+ (xcb:unmarshal evt data)
+ (with-slots (window) evt
+ (when (eq window exwm--root)
+ (exwm-randr-refresh)))))
+
+(cl-defun exwm-randr--init ()
+ "Initialize RandR extension and EXWM RandR module."
+ (exwm--log)
+ (when exwm-randr--connection
+ (cl-return-from exwm-randr--init))
+ (setq exwm-randr--connection (xcb:connect))
+ (set-process-query-on-exit-flag (slot-value exwm-randr--connection 'process) nil)
+ (when (= 0 (slot-value (xcb:get-extension-data exwm-randr--connection 'xcb:randr)
+ 'present))
+ (xcb:disconnect exwm-randr--connection)
+ (setq exwm-randr--connection nil)
+ (error "[EXWM] RandR extension is not supported by the server"))
+ (with-slots (major-version minor-version)
+ (xcb:+request-unchecked+reply exwm-randr--connection
+ (make-instance 'xcb:randr:QueryVersion
+ :major-version 1 :minor-version 5))
+ (cond ((and (= major-version 1) (= minor-version 5))
+ (setq exwm-randr--compatibility-mode nil))
+ ((and (= major-version 1) (>= minor-version 2))
+ (setq exwm-randr--compatibility-mode t))
+ (t
+ (xcb:disconnect exwm-randr--connection)
+ (setq exwm-randr--connection nil)
+ (error "[EXWM] The server only support RandR version up to %d.%d"
+ major-version minor-version)))
+ ;; External monitor(s) may already be connected.
+ (run-hooks 'exwm-randr-screen-change-hook)
+ (exwm-randr-refresh)
+ ;; Listen for `ScreenChangeNotify' to notify external tools to
+ ;; configure RandR and `CrtcChangeNotify/OutputChangeNotify' to
+ ;; refresh the workspace layout.
+ (xcb:+event exwm-randr--connection 'xcb:randr:ScreenChangeNotify
+ #'exwm-randr--on-ScreenChangeNotify)
+ (xcb:+event exwm-randr--connection 'xcb:randr:Notify
+ #'exwm-randr--on-Notify)
+ (xcb:+event exwm-randr--connection 'xcb:ConfigureNotify
+ #'exwm-randr--on-ConfigureNotify)
+ (xcb:+request exwm-randr--connection
+ (make-instance 'xcb:randr:SelectInput
+ :window exwm--root
+ :enable (logior
+ xcb:randr:NotifyMask:ScreenChange
+ xcb:randr:NotifyMask:CrtcChange
+ xcb:randr:NotifyMask:OutputChange)))
+ (xcb:flush exwm-randr--connection)
+ (add-hook 'exwm-workspace-list-change-hook #'exwm-randr-refresh))
+ ;; Prevent frame parameters introduced by this module from being
+ ;; saved/restored.
+ (dolist (i '(exwm-randr-monitor))
+ (unless (assq i frameset-filter-alist)
+ (push (cons i :never) frameset-filter-alist))))
+
+(defun exwm-randr--exit ()
+ "Exit the RandR module."
+ (exwm--log)
+ (remove-hook 'exwm-workspace-list-change-hook #'exwm-randr-refresh)
+ (when exwm-randr--connection
+ (xcb:disconnect exwm-randr--connection)
+ (setq exwm-randr--connection nil)))
+
+(provide 'exwm-randr)
+;;; exwm-randr.el ends here
diff --git a/elpa/exwm-0.33/exwm-randr.elc b/elpa/exwm-0.33/exwm-randr.elc
new file mode 100644
index 0000000..ee66a40
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-randr.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-systemtray.el b/elpa/exwm-0.33/exwm-systemtray.el
new file mode 100644
index 0000000..9b23ea0
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-systemtray.el
@@ -0,0 +1,693 @@
+;;; exwm-systemtray.el --- System Tray Module for -*- lexical-binding: t -*-
+;;; EXWM
+
+;; Copyright (C) 2016-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 module adds system tray support for EXWM.
+
+;; To use this module, enable it as follows:
+;;
+;; (exwm-systemtray-mode 1)
+
+;;; Code:
+
+(require 'xcb-ewmh)
+(require 'xcb-icccm)
+(require 'xcb-xembed)
+(require 'xcb-systemtray)
+
+(require 'exwm-core)
+(require 'exwm-workspace)
+
+(declare-function exwm-workspace--workarea "exwm-workspace.el" (frame))
+
+(defclass exwm-systemtray--icon ()
+ ((width :initarg :width)
+ (height :initarg :height)
+ (visible :initarg :visible))
+ :documentation "Attributes of a system tray icon.")
+
+(defgroup exwm-systemtray nil
+ "System tray."
+ :group 'exwm)
+
+;;;###autoload
+(define-minor-mode exwm-systemtray-mode
+ "Toggle EXWM systemtray support."
+ :global t
+ :group 'exwm-systemtray
+ (exwm--global-minor-mode-body systemtray))
+
+(defcustom exwm-systemtray-height nil
+ "System tray height.
+
+You shall use the default value if using auto-hide minibuffer."
+ :type 'integer)
+
+(defcustom exwm-systemtray-icon-gap 2
+ "Gap between icons."
+ :type 'integer)
+
+(defvar exwm-systemtray--connection nil "The X connection.")
+
+(defvar exwm-systemtray--embedder-window nil "The embedder window.")
+(defvar exwm-systemtray--embedder-window-depth nil
+ "The embedder window's depth.")
+
+(defcustom exwm-systemtray-background-color 'workspace-background
+ "Background color of systemtray.
+This should be a color, the symbol `workspace-background' for the background
+color of current workspace frame, or the symbol `transparent' for transparent
+background.
+
+Transparent background is not yet supported when Emacs uses 32-bit depth
+visual, as reported by `x-display-planes'. The X resource \"Emacs.visualClass:
+TrueColor-24\" can be used to force Emacs to use 24-bit depth."
+ :type '(choice (const :tag "Transparent" transparent)
+ (const :tag "Frame background" workspace-background)
+ (color :tag "Color"))
+ :initialize #'custom-initialize-default
+ :set (lambda (symbol value)
+ (when (and (eq value 'transparent)
+ (not (exwm-systemtray--transparency-supported-p)))
+ (display-warning 'exwm-systemtray
+ "Transparent background is not supported yet when \
+using 32-bit depth. Using `workspace-background' instead.")
+ (setq value 'workspace-background))
+ (set-default symbol value)
+ (when (and exwm-systemtray-mode
+ exwm-systemtray--connection
+ exwm-systemtray--embedder-window)
+ ;; Change the background color for embedder.
+ (exwm-systemtray--set-background-color)
+ ;; Unmap & map to take effect immediately.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:UnmapWindow
+ :window exwm-systemtray--embedder-window))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:MapWindow
+ :window exwm-systemtray--embedder-window))
+ (xcb:flush exwm-systemtray--connection))))
+
+;; GTK icons require at least 16 pixels to show normally.
+(defconst exwm-systemtray--icon-min-size 16 "Minimum icon size.")
+
+(defvar exwm-systemtray--list nil "The icon list.")
+
+(defvar exwm-systemtray--selection-owner-window nil
+ "The selection owner window.")
+
+(defvar xcb:Atom:_NET_SYSTEM_TRAY_S0)
+
+(defun exwm-systemtray--embed (icon)
+ "Embed an ICON."
+ (exwm--log "Try to embed #x%x" icon)
+ (let ((info (xcb:+request-unchecked+reply exwm-systemtray--connection
+ (make-instance 'xcb:xembed:get-_XEMBED_INFO
+ :window icon)))
+ width* height* visible)
+ (when info
+ (exwm--log "Embed #x%x" icon)
+ (with-slots (width height)
+ (xcb:+request-unchecked+reply exwm-systemtray--connection
+ (make-instance 'xcb:GetGeometry :drawable icon))
+ (setq height* exwm-systemtray-height
+ width* (round (* width (/ (float height*) height))))
+ (when (< width* exwm-systemtray--icon-min-size)
+ (setq width* exwm-systemtray--icon-min-size
+ height* (round (* height (/ (float width*) width)))))
+ (exwm--log "Resize from %dx%d to %dx%d"
+ width height width* height*))
+ ;; Add this icon to save-set.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ChangeSaveSet
+ :mode xcb:SetMode:Insert
+ :window icon))
+ ;; Reparent to the embedder.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ReparentWindow
+ :window icon
+ :parent exwm-systemtray--embedder-window
+ :x 0
+ ;; Vertically centered.
+ :y (/ (- exwm-systemtray-height height*) 2)))
+ ;; Resize the icon.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window icon
+ :value-mask (logior xcb:ConfigWindow:Width
+ xcb:ConfigWindow:Height
+ xcb:ConfigWindow:BorderWidth)
+ :width width*
+ :height height*
+ :border-width 0))
+ ;; Set event mask.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window icon
+ :value-mask xcb:CW:EventMask
+ :event-mask (logior xcb:EventMask:ResizeRedirect
+ xcb:EventMask:KeyPress
+ xcb:EventMask:PropertyChange)))
+ ;; Grab all keys and forward them to Emacs frame.
+ (unless (exwm-workspace--minibuffer-own-frame-p)
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:GrabKey
+ :owner-events 0
+ :grab-window icon
+ :modifiers xcb:ModMask:Any
+ :key xcb:Grab:Any
+ :pointer-mode xcb:GrabMode:Async
+ :keyboard-mode xcb:GrabMode:Async)))
+ (setq visible (slot-value info 'flags))
+ (if visible
+ (setq visible
+ (/= 0 (logand (slot-value info 'flags) xcb:xembed:MAPPED)))
+ ;; Default to visible.
+ (setq visible t))
+ (when visible
+ (exwm--log "Map the window")
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:MapWindow :window icon)))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:xembed:SendEvent
+ :destination icon
+ :event
+ (xcb:marshal
+ (make-instance 'xcb:xembed:EMBEDDED-NOTIFY
+ :window icon
+ :time xcb:Time:CurrentTime
+ :embedder
+ exwm-systemtray--embedder-window
+ :version 0)
+ exwm-systemtray--connection)))
+ (push `(,icon . ,(make-instance 'exwm-systemtray--icon
+ :width width*
+ :height height*
+ :visible visible))
+ exwm-systemtray--list)
+ (exwm-systemtray--refresh))))
+
+(defun exwm-systemtray--unembed (icon)
+ "Unembed an ICON."
+ (exwm--log "Unembed #x%x" icon)
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:UnmapWindow :window icon))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ReparentWindow
+ :window icon
+ :parent exwm--root
+ :x 0 :y 0))
+ (setq exwm-systemtray--list
+ (assq-delete-all icon exwm-systemtray--list))
+ (exwm-systemtray--refresh))
+
+(defun exwm-systemtray--refresh ()
+ "Refresh the system tray."
+ (exwm--log)
+ ;; Make sure to redraw the embedder.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:UnmapWindow
+ :window exwm-systemtray--embedder-window))
+ (let ((x exwm-systemtray-icon-gap)
+ map)
+ (dolist (pair exwm-systemtray--list)
+ (when (slot-value (cdr pair) 'visible)
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (car pair)
+ :value-mask xcb:ConfigWindow:X
+ :x x))
+ (setq x (+ x (slot-value (cdr pair) 'width)
+ exwm-systemtray-icon-gap))
+ (setq map t)))
+ (let ((workarea (exwm-workspace--workarea exwm-workspace-current-index)))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window exwm-systemtray--embedder-window
+ :value-mask (logior xcb:ConfigWindow:X
+ xcb:ConfigWindow:Width)
+ :x (- (slot-value workarea 'width) x)
+ :width x)))
+ (when map
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:MapWindow
+ :window exwm-systemtray--embedder-window))))
+ (xcb:flush exwm-systemtray--connection))
+
+(defun exwm-systemtray--refresh-background-color (&optional remap)
+ "Refresh background color after theme change or workspace switch.
+If REMAP is not nil, map and unmap the embedder window so that the background is
+redrawn."
+ ;; Only `workspace-background' is dependent on current theme and workspace.
+ (when (eq 'workspace-background exwm-systemtray-background-color)
+ (exwm-systemtray--set-background-color)
+ (when remap
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:UnmapWindow
+ :window exwm-systemtray--embedder-window))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:MapWindow
+ :window exwm-systemtray--embedder-window))
+ (xcb:flush exwm-systemtray--connection))))
+
+(defun exwm-systemtray--set-background-color ()
+ "Change the background color of the embedder.
+The color is set according to `exwm-systemtray-background-color'.
+
+Note that this function does not change the current contents of the embedder
+window; unmap & map are necessary for the background color to take effect."
+ (when (and exwm-systemtray--connection
+ exwm-systemtray--embedder-window)
+ (let* ((color (cl-case exwm-systemtray-background-color
+ ((transparent nil) ; nil means transparent as well
+ (if (exwm-systemtray--transparency-supported-p)
+ nil
+ (message "%s" "[EXWM] system tray does not support \
+`transparent' background; using `workspace-background' instead")
+ (face-background 'default exwm-workspace--current)))
+ (workspace-background
+ (face-background 'default exwm-workspace--current))
+ (t exwm-systemtray-background-color)))
+ (background-pixel (exwm--color->pixel color)))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window exwm-systemtray--embedder-window
+ ;; Either-or. A `background-pixel' of nil
+ ;; means simulate transparency. We use
+ ;; `xcb:CW:BackPixmap' together with
+ ;; `xcb:BackPixmap:ParentRelative' do that,
+ ;; but this only works when the parent
+ ;; window's visual (Emacs') has the same
+ ;; visual depth.
+ :value-mask (if background-pixel
+ xcb:CW:BackPixel
+ xcb:CW:BackPixmap)
+ ;; Due to the :value-mask above,
+ ;; :background-pixmap only takes effect when
+ ;; `transparent' is requested and supported
+ ;; (visual depth of Emacs and of system tray
+ ;; are equal). Setting
+ ;; `xcb:BackPixmap:ParentRelative' when
+ ;; that's not the case would produce an
+ ;; `xcb:Match' error.
+ :background-pixmap xcb:BackPixmap:ParentRelative
+ :background-pixel background-pixel)))))
+
+(defun exwm-systemtray--transparency-supported-p ()
+ "Check whether transparent background is supported.
+EXWM system tray supports transparency when the visual depth of the system tray
+window matches that of Emacs. The visual depth of the system tray window is the
+default visual depth of the display.
+
+Sections \"Visual and background pixmap handling\" and
+\"_NET_SYSTEM_TRAY_VISUAL\" of the System Tray Protocol Specification
+\(https://specifications.freedesktop.org/systemtray-spec/systemtray-spec-latest.html#visuals)
+indicate how to support actual transparency."
+ (let ((planes (x-display-planes)))
+ (if exwm-systemtray--embedder-window-depth
+ (= planes exwm-systemtray--embedder-window-depth)
+ (<= planes 24))))
+
+(defun exwm-systemtray--on-DestroyNotify (data _synthetic)
+ "Unembed icons on DestroyNotify.
+Argument DATA contains the raw event data."
+ (exwm--log)
+ (let ((obj (make-instance 'xcb:DestroyNotify)))
+ (xcb:unmarshal obj data)
+ (with-slots (window) obj
+ (when (assoc window exwm-systemtray--list)
+ (exwm-systemtray--unembed window)))))
+
+(defun exwm-systemtray--on-ReparentNotify (data _synthetic)
+ "Unembed icons on ReparentNotify.
+Argument DATA contains the raw event data."
+ (exwm--log)
+ (let ((obj (make-instance 'xcb:ReparentNotify)))
+ (xcb:unmarshal obj data)
+ (with-slots (window parent) obj
+ (when (and (/= parent exwm-systemtray--embedder-window)
+ (assoc window exwm-systemtray--list))
+ (exwm-systemtray--unembed window)))))
+
+(defun exwm-systemtray--on-ResizeRequest (data _synthetic)
+ "Resize the tray icon on ResizeRequest.
+Argument DATA contains the raw event data."
+ (exwm--log)
+ (let ((obj (make-instance 'xcb:ResizeRequest))
+ attr)
+ (xcb:unmarshal obj data)
+ (with-slots (window width height) obj
+ (when (setq attr (cdr (assoc window exwm-systemtray--list)))
+ (with-slots ((width* width)
+ (height* height))
+ attr
+ (setq height* exwm-systemtray-height
+ width* (round (* width (/ (float height*) height))))
+ (when (< width* exwm-systemtray--icon-min-size)
+ (setq width* exwm-systemtray--icon-min-size
+ height* (round (* height (/ (float width*) width)))))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window window
+ :value-mask (logior xcb:ConfigWindow:Y
+ xcb:ConfigWindow:Width
+ xcb:ConfigWindow:Height)
+ ;; Vertically centered.
+ :y (/ (- exwm-systemtray-height height*) 2)
+ :width width*
+ :height height*)))
+ (exwm-systemtray--refresh)))))
+
+(defun exwm-systemtray--on-PropertyNotify (data _synthetic)
+ "Map/Unmap the tray icon on PropertyNotify.
+Argument DATA contains the raw event data."
+ (exwm--log)
+ (let ((obj (make-instance 'xcb:PropertyNotify))
+ attr info visible)
+ (xcb:unmarshal obj data)
+ (with-slots (window atom state) obj
+ (when (and (eq state xcb:Property:NewValue)
+ (eq atom xcb:Atom:_XEMBED_INFO)
+ (setq attr (cdr (assoc window exwm-systemtray--list))))
+ (setq info (xcb:+request-unchecked+reply exwm-systemtray--connection
+ (make-instance 'xcb:xembed:get-_XEMBED_INFO
+ :window window)))
+ (when info
+ (setq visible (/= 0 (logand (slot-value info 'flags)
+ xcb:xembed:MAPPED)))
+ (exwm--log "#x%x visible? %s" window visible)
+ (if visible
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:MapWindow :window window))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:UnmapWindow :window window)))
+ (setf (slot-value attr 'visible) visible)
+ (exwm-systemtray--refresh))))))
+
+(defun exwm-systemtray--on-ClientMessage (data _synthetic)
+ "Handle client messages.
+Argument DATA contains the raw event data."
+ (let ((obj (make-instance 'xcb:ClientMessage))
+ opcode data32)
+ (xcb:unmarshal obj data)
+ (with-slots (window type data) obj
+ (when (eq type xcb:Atom:_NET_SYSTEM_TRAY_OPCODE)
+ (setq data32 (slot-value data 'data32)
+ opcode (elt data32 1))
+ (exwm--log "opcode: %s" opcode)
+ (cond ((= opcode xcb:systemtray:opcode:REQUEST-DOCK)
+ (unless (assoc (elt data32 2) exwm-systemtray--list)
+ (exwm-systemtray--embed (elt data32 2))))
+ ;; Not implemented (rarely used nowadays).
+ ((or (= opcode xcb:systemtray:opcode:BEGIN-MESSAGE)
+ (= opcode xcb:systemtray:opcode:CANCEL-MESSAGE)))
+ (t
+ (exwm--log "Unknown opcode message: %s" obj)))))))
+
+(defun exwm-systemtray--on-KeyPress (data _synthetic)
+ "Forward all KeyPress events to Emacs frame.
+Argument DATA contains the raw event data."
+ (exwm--log)
+ ;; This function is only executed when there's no autohide minibuffer,
+ ;; a workspace frame has the input focus and the pointer is over a
+ ;; tray icon.
+ (let ((dest (frame-parameter (selected-frame) 'exwm-outer-id))
+ (obj (make-instance 'xcb:KeyPress)))
+ (xcb:unmarshal obj data)
+ (setf (slot-value obj 'event) dest)
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination dest
+ :event-mask xcb:EventMask:NoEvent
+ :event (xcb:marshal obj exwm-systemtray--connection))))
+ (xcb:flush exwm-systemtray--connection))
+
+(defun exwm-systemtray--on-workspace-switch ()
+ "Reparent/Refresh the system tray in `exwm-workspace-switch-hook'."
+ (exwm--log)
+ (unless (exwm-workspace--minibuffer-own-frame-p)
+ (exwm-workspace--update-offsets)
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ReparentWindow
+ :window exwm-systemtray--embedder-window
+ :parent (string-to-number
+ (frame-parameter exwm-workspace--current
+ 'window-id))
+ :x 0
+ :y (- (slot-value (exwm-workspace--workarea
+ exwm-workspace-current-index)
+ 'height)
+ exwm-workspace--frame-y-offset
+ exwm-systemtray-height))))
+ (exwm-systemtray--refresh-background-color)
+ (exwm-systemtray--refresh))
+
+(defun exwm-systemtray--on-theme-change (_theme)
+ "Refresh system tray upon theme change."
+ (exwm-systemtray--refresh-background-color 'remap))
+
+(defun exwm-systemtray--refresh-all ()
+ "Reposition/Refresh the system tray."
+ (exwm--log)
+ (unless (exwm-workspace--minibuffer-own-frame-p)
+ (exwm-workspace--update-offsets)
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window exwm-systemtray--embedder-window
+ :value-mask xcb:ConfigWindow:Y
+ :y (- (slot-value (exwm-workspace--workarea
+ exwm-workspace-current-index)
+ 'height)
+ exwm-workspace--frame-y-offset
+ exwm-systemtray-height))))
+ (exwm-systemtray--refresh))
+
+(cl-defun exwm-systemtray--init ()
+ "Initialize system tray module."
+ (exwm--log)
+ ;; idempotent initialization
+ (when exwm-systemtray--connection
+ (cl-return-from exwm-systemtray--init))
+ (cl-assert (not exwm-systemtray--list))
+ (cl-assert (not exwm-systemtray--selection-owner-window))
+ (cl-assert (not exwm-systemtray--embedder-window))
+ (unless exwm-systemtray-height
+ (setq exwm-systemtray-height (max exwm-systemtray--icon-min-size
+ (with-selected-window (minibuffer-window)
+ (line-pixel-height)))))
+ ;; Create a new connection.
+ (setq exwm-systemtray--connection (xcb:connect))
+ (set-process-query-on-exit-flag (slot-value exwm-systemtray--connection
+ 'process)
+ nil)
+ ;; Initialize XELB modules.
+ (xcb:xembed:init exwm-systemtray--connection t)
+ (xcb:systemtray:init exwm-systemtray--connection t)
+ ;; Acquire the manager selection _NET_SYSTEM_TRAY_S0.
+ (with-slots (owner)
+ (xcb:+request-unchecked+reply exwm-systemtray--connection
+ (make-instance 'xcb:GetSelectionOwner
+ :selection xcb:Atom:_NET_SYSTEM_TRAY_S0))
+ (when (/= owner xcb:Window:None)
+ (xcb:disconnect exwm-systemtray--connection)
+ (setq exwm-systemtray--connection nil)
+ (warn "[EXWM] Other system tray detected")
+ (cl-return-from exwm-systemtray--init)))
+ (let ((id (xcb:generate-id exwm-systemtray--connection)))
+ (setq exwm-systemtray--selection-owner-window id)
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:CreateWindow
+ :depth 0
+ :wid id
+ :parent exwm--root
+ :x 0
+ :y 0
+ :width 1
+ :height 1
+ :border-width 0
+ :class xcb:WindowClass:InputOnly
+ :visual 0
+ :value-mask xcb:CW:OverrideRedirect
+ :override-redirect 1))
+ ;; Get the selection ownership.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:SetSelectionOwner
+ :owner id
+ :selection xcb:Atom:_NET_SYSTEM_TRAY_S0
+ :time xcb:Time:CurrentTime))
+ ;; Send a client message to announce the selection.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination exwm--root
+ :event-mask xcb:EventMask:StructureNotify
+ :event (xcb:marshal
+ (make-instance 'xcb:icccm:-ManagerSelection
+ :window exwm--root
+ :time xcb:Time:CurrentTime
+ :selection
+ xcb:Atom:_NET_SYSTEM_TRAY_S0
+ :owner id)
+ exwm-systemtray--connection)))
+ ;; Set _NET_WM_NAME.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window id
+ :data "EXWM: exwm-systemtray--selection-owner-window"))
+ ;; Set the _NET_SYSTEM_TRAY_ORIENTATION property.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:xembed:set-_NET_SYSTEM_TRAY_ORIENTATION
+ :window id
+ :data xcb:systemtray:ORIENTATION:HORZ)))
+ ;; Create the embedder.
+ (let ((id (xcb:generate-id exwm-systemtray--connection))
+ frame parent embedder-depth embedder-visual embedder-colormap y)
+ (setq exwm-systemtray--embedder-window id)
+ (if (exwm-workspace--minibuffer-own-frame-p)
+ (setq frame exwm-workspace--minibuffer
+ y (if (>= (line-pixel-height) exwm-systemtray-height)
+ ;; Bottom aligned.
+ (- (line-pixel-height) exwm-systemtray-height)
+ ;; Vertically centered.
+ (/ (- (line-pixel-height) exwm-systemtray-height) 2)))
+ (exwm-workspace--update-offsets)
+ (setq frame exwm-workspace--current
+ ;; Bottom aligned.
+ y (- (slot-value (exwm-workspace--workarea
+ exwm-workspace-current-index)
+ 'height)
+ exwm-workspace--frame-y-offset
+ exwm-systemtray-height)))
+ (setq parent (string-to-number (frame-parameter frame 'window-id)))
+ ;; Use default depth, visual and colormap (from root window), instead of
+ ;; Emacs frame's. See Section "Visual and background pixmap handling" in
+ ;; "System Tray Protocol Specification 0.3".
+ (let* ((vdc (exwm--get-visual-depth-colormap exwm-systemtray--connection
+ exwm--root)))
+ (setq embedder-visual (car vdc))
+ (setq embedder-depth (cadr vdc))
+ (setq embedder-colormap (caddr vdc)))
+ ;; Note down the embedder window's depth. It will be used to check whether
+ ;; we can use xcb:BackPixmap:ParentRelative to emulate transparency.
+ (setq exwm-systemtray--embedder-window-depth embedder-depth)
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:CreateWindow
+ :depth embedder-depth
+ :wid id
+ :parent parent
+ :x 0
+ :y y
+ :width 1
+ :height exwm-systemtray-height
+ :border-width 0
+ :class xcb:WindowClass:InputOutput
+ :visual embedder-visual
+ :colormap embedder-colormap
+ :value-mask (logior xcb:CW:BorderPixel
+ xcb:CW:Colormap
+ xcb:CW:EventMask)
+ :border-pixel 0
+ :event-mask xcb:EventMask:SubstructureNotify))
+ (exwm-systemtray--set-background-color)
+ ;; Set _NET_WM_NAME.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window id
+ :data "EXWM: exwm-systemtray--embedder-window"))
+ ;; Set _NET_WM_WINDOW_TYPE.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_WINDOW_TYPE
+ :window id
+ :data (vector xcb:Atom:_NET_WM_WINDOW_TYPE_DOCK)))
+ ;; Set _NET_SYSTEM_TRAY_VISUAL.
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:xembed:set-_NET_SYSTEM_TRAY_VISUAL
+ :window exwm-systemtray--selection-owner-window
+ :data embedder-visual)))
+ (xcb:flush exwm-systemtray--connection)
+ ;; Attach event listeners.
+ (xcb:+event exwm-systemtray--connection 'xcb:DestroyNotify
+ #'exwm-systemtray--on-DestroyNotify)
+ (xcb:+event exwm-systemtray--connection 'xcb:ReparentNotify
+ #'exwm-systemtray--on-ReparentNotify)
+ (xcb:+event exwm-systemtray--connection 'xcb:ResizeRequest
+ #'exwm-systemtray--on-ResizeRequest)
+ (xcb:+event exwm-systemtray--connection 'xcb:PropertyNotify
+ #'exwm-systemtray--on-PropertyNotify)
+ (xcb:+event exwm-systemtray--connection 'xcb:ClientMessage
+ #'exwm-systemtray--on-ClientMessage)
+ (unless (exwm-workspace--minibuffer-own-frame-p)
+ (xcb:+event exwm-systemtray--connection 'xcb:KeyPress
+ #'exwm-systemtray--on-KeyPress))
+ ;; Add hook to move/reparent the embedder.
+ (add-hook 'exwm-workspace-switch-hook #'exwm-systemtray--on-workspace-switch)
+ (add-hook 'exwm-workspace--update-workareas-hook
+ #'exwm-systemtray--refresh-all)
+ ;; Add hook to update background colors.
+ (add-hook 'enable-theme-functions #'exwm-systemtray--on-theme-change)
+ (add-hook 'disable-theme-functions #'exwm-systemtray--on-theme-change)
+ (add-hook 'menu-bar-mode-hook #'exwm-systemtray--refresh-all)
+ (add-hook 'tool-bar-mode-hook #'exwm-systemtray--refresh-all)
+ (when (boundp 'exwm-randr-refresh-hook)
+ (add-hook 'exwm-randr-refresh-hook #'exwm-systemtray--refresh-all))
+ ;; The struts can be updated already.
+ (when exwm-workspace--workareas
+ (exwm-systemtray--refresh-all)))
+
+(defun exwm-systemtray--exit ()
+ "Exit the systemtray module."
+ (exwm--log)
+ (when exwm-systemtray--connection
+ (when (slot-value exwm-systemtray--connection 'connected)
+ ;; Hide & reparent out the embedder before disconnection to prevent
+ ;; embedded icons from being reparented to an Emacs frame (which is the
+ ;; parent of the embedder).
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:UnmapWindow
+ :window exwm-systemtray--embedder-window))
+ (xcb:+request exwm-systemtray--connection
+ (make-instance 'xcb:ReparentWindow
+ :window exwm-systemtray--embedder-window
+ :parent exwm--root
+ :x 0
+ :y 0))
+ (xcb:disconnect exwm-systemtray--connection))
+ (setq exwm-systemtray--connection nil
+ exwm-systemtray--list nil
+ exwm-systemtray--selection-owner-window nil
+ exwm-systemtray--embedder-window nil
+ exwm-systemtray--embedder-window-depth nil)
+ (remove-hook 'exwm-workspace-switch-hook
+ #'exwm-systemtray--on-workspace-switch)
+ (remove-hook 'exwm-workspace--update-workareas-hook
+ #'exwm-systemtray--refresh-all)
+ (remove-hook 'enable-theme-functions #'exwm-systemtray--on-theme-change)
+ (remove-hook 'disable-theme-functions #'exwm-systemtray--on-theme-change)
+ (remove-hook 'menu-bar-mode-hook #'exwm-systemtray--refresh-all)
+ (remove-hook 'tool-bar-mode-hook #'exwm-systemtray--refresh-all)
+ (when (boundp 'exwm-randr-refresh-hook)
+ (remove-hook 'exwm-randr-refresh-hook #'exwm-systemtray--refresh-all))))
+
+(provide 'exwm-systemtray)
+;;; exwm-systemtray.el ends here
diff --git a/elpa/exwm-0.33/exwm-systemtray.elc b/elpa/exwm-0.33/exwm-systemtray.elc
new file mode 100644
index 0000000..9c5289c
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-systemtray.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-workspace.el b/elpa/exwm-0.33/exwm-workspace.el
new file mode 100644
index 0000000..1a32bd7
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-workspace.el
@@ -0,0 +1,1773 @@
+;;; exwm-workspace.el --- Workspace Module for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 1015-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 module adds workspace support for EXWM.
+
+;;; Code:
+
+(require 'server)
+
+(require 'exwm-core)
+
+(defgroup exwm-workspace nil
+ "Workspace."
+ :group 'exwm)
+
+(defcustom exwm-workspace-switch-hook nil
+ "Normal hook run after switching workspace."
+ :type 'hook)
+
+(defcustom exwm-workspace-list-change-hook nil
+ "Normal hook run when the workspace list is changed.
+This happens when a workspace is added, deleted, moved, etc."
+ :type 'hook)
+
+(defcustom exwm-workspace-show-all-buffers nil
+ "Non-nil to show buffers on other workspaces."
+ :type 'boolean)
+
+(defcustom exwm-workspace-warp-cursor nil
+ "Non-nil to warp cursor automatically after workspace switch."
+ :type 'boolean)
+
+(defcustom exwm-workspace-number 1
+ "Initial number of workspaces."
+ :type 'integer)
+
+(defvar exwm-workspace--switch-history nil
+ "History for `read-from-minibuffer' to interactively switch workspace.")
+
+(defvar exwm-workspace--switch-history-outdated nil
+ "Non-nil to indicate `exwm-workspace--switch-history' is outdated.")
+
+(defvar exwm-workspace--switch-by-index-map
+ (let ((map (make-sparse-keymap)))
+ (dotimes (i 10)
+ (keymap-set map (int-to-string i)
+ #'exwm-workspace--switch-map-nth-prefix))
+ map)
+ "Keymap used to switch workspaces by index.")
+
+(defvar exwm-workspace--switch-by-name-map (make-sparse-keymap)
+ "Keymap used to switch workspaces by index.
+Applicable when the name returned by `exwm-workspace-index-map' is also
+a valid key.")
+
+(defcustom exwm-workspace-index-map #'number-to-string
+ "Function for mapping a workspace index to a string for display.
+
+By default `number-to-string' is applied which yields 0 1 2 ... ."
+ :type 'function
+ :initialize 'custom-initialize-changed
+ :set (lambda (symbol value)
+ (set-default-toplevel-value symbol value)
+ (setq exwm-workspace--switch-history-outdated t)
+ (exwm-workspace--update-switch-by-name-map)))
+
+(defcustom exwm-workspace-minibuffer-position nil
+ "Position of the minibuffer frame.
+
+A restart is required for this change to take effect."
+ :type '(choice (const :tag "Bottom (fixed)" nil)
+ (const :tag "Bottom (auto-hide)" bottom)
+ (const :tag "Top (auto-hide)" top)))
+
+(defcustom exwm-workspace-display-echo-area-timeout 1
+ "Timeout for displaying echo area."
+ :type 'integer)
+
+(defcustom exwm-workspace-switch-create-limit 10
+ "Number of workspaces `exwm-workspace-switch-create' is allowed to create."
+ :type 'integer)
+
+(defvar exwm-workspace-current-index 0 "Index of current active workspace.")
+
+(defvar exwm-workspace--attached-minibuffer-height 0
+ "Height (in pixel) of the attached minibuffer.
+
+If the minibuffer is detached, this value is 0.")
+
+(defvar exwm-workspace--create-silently nil
+ "When non-nil workspaces are created in the background (not switched to).
+
+Please manually run the hook `exwm-workspace-list-change-hook' afterwards.")
+
+(defvar exwm-workspace--current nil "Current active workspace.")
+
+(defvar exwm-workspace--display-echo-area-timer nil
+ "Timer for auto-hiding echo area.")
+
+(defvar exwm-workspace--id-struts-alist nil "Alist of X window and struts.")
+
+(defvar exwm-workspace--fullscreen-frame-count 0
+ "Count the fullscreen workspace frames.")
+
+(defvar exwm-workspace--list nil "List of all workspaces (Emacs frames).")
+
+(defvar exwm-workspace--minibuffer nil
+ "The minibuffer frame shared among all frames.")
+
+(defvar exwm-workspace--original-handle-focus-in
+ (symbol-function #'handle-focus-in))
+(defvar exwm-workspace--original-handle-focus-out
+ (symbol-function #'handle-focus-out))
+
+(defvar exwm-workspace--prompt-add-allowed nil
+ "Non-nil to allow adding workspace from the prompt.")
+
+(defvar exwm-workspace--prompt-delete-allowed nil
+ "Non-nil to allow deleting workspace from the prompt.")
+
+(defvar exwm-workspace--struts nil "Areas occupied by struts.")
+
+(defvar exwm-workspace--timer nil "Timer used to track echo area changes.")
+
+(defvar exwm-workspace--update-workareas-hook nil
+ "Normal hook run when workareas get updated.")
+
+(defvar exwm-workspace--workareas nil "Workareas (struts excluded).")
+
+(defvar exwm-workspace--frame-y-offset 0
+ "Offset between Emacs inner & outer frame in Y.")
+(defvar exwm-workspace--window-y-offset 0
+ "Offset between Emacs first window & outer frame in Y.")
+
+(defvar exwm-input--event-hook)
+(defvar exwm-layout-show-all-buffers)
+(defvar exwm-manage--desktop)
+(declare-function exwm-input--on-buffer-list-update "exwm-input.el" ())
+(declare-function exwm-layout--fullscreen-p "exwm-layout.el" ())
+(declare-function exwm-layout--hide "exwm-layout.el" (id))
+(declare-function exwm-layout--other-buffer-predicate "exwm-layout.el"
+ (buffer))
+(declare-function exwm-layout--refresh "exwm-layout.el")
+(declare-function exwm-layout--show "exwm-layout.el" (id &optional window))
+
+(defsubst exwm-workspace--position (frame)
+ "Retrieve index of given FRAME in workspace list.
+NIL if FRAME is not a workspace."
+ (declare (indent defun))
+ (cl-position frame exwm-workspace--list))
+
+(defsubst exwm-workspace--count ()
+ "Retrieve total number of workspaces."
+ (length exwm-workspace--list))
+
+(defsubst exwm-workspace--workspace-p (frame)
+ "Return t if FRAME is a workspace."
+ (declare (indent defun))
+ (memq frame exwm-workspace--list))
+
+(defsubst exwm-workspace--workarea (frame)
+ "Return workarea corresponding to FRAME.
+FRAME may be either a workspace frame or a workspace position."
+ (declare (indent defun))
+ (elt exwm-workspace--workareas
+ (if (integerp frame)
+ frame
+ (exwm-workspace--position frame))))
+
+(defvar-keymap exwm-workspace-switch-map
+ :doc "Keymap used by `exwm-workspace-switch'."
+ "+" #'exwm-workspace--prompt-add
+ "-" #'exwm-workspace--prompt-delete
+ "C-a" (lambda () (interactive) (goto-history-element 1))
+ "C-e" (lambda () (interactive) (goto-history-element (exwm-workspace--count)))
+ "C-g" #'abort-recursive-edit
+ "C-]" #'abort-recursive-edit
+ "C-j" #'exit-minibuffer
+ "<return>" #'exit-minibuffer
+ "<space>" #'exit-minibuffer
+ "C-f" #'previous-history-element
+ "C-b" #'next-history-element
+ ;; Alternative keys
+ "<right>" #'previous-history-element
+ "<left>" #'next-history-element)
+
+(defvar exwm-workspace--switch-composed-map
+ (make-composed-keymap (list
+ exwm-workspace-switch-map
+ exwm-workspace--switch-by-name-map
+ exwm-workspace--switch-by-index-map)
+ (define-keymap "<t>" #'undefined))
+ "Internal Keymap composing all the keymaps used by `exwm-workspace-switch'.")
+
+(defun exwm-workspace--workspace-from-frame-or-index (frame-or-index)
+ "Retrieve the workspace frame from FRAME-OR-INDEX."
+ (cond
+ ((framep frame-or-index)
+ (unless (exwm-workspace--position frame-or-index)
+ (user-error "[EXWM] Frame is not a workspace %S" frame-or-index))
+ frame-or-index)
+ ((integerp frame-or-index)
+ (unless (and (<= 0 frame-or-index)
+ (< frame-or-index (exwm-workspace--count)))
+ (user-error "[EXWM] Workspace index out of range: %d" frame-or-index))
+ (elt exwm-workspace--list frame-or-index))
+ (t (user-error "[EXWM] Invalid workspace: %s" frame-or-index))))
+
+(defun exwm-workspace--prompt-for-workspace (&optional prompt)
+ "Prompt for a workspace, returning the workspace frame.
+Show PROMPT to the user if non-nil."
+ (exwm-workspace--update-switch-history)
+ (let* ((current-idx (exwm-workspace--position exwm-workspace--current))
+ (history-add-new-input nil) ;prevent modifying history
+ (history-idx (read-from-minibuffer
+ (or prompt "Workspace: ")
+ (elt exwm-workspace--switch-history current-idx)
+ exwm-workspace--switch-composed-map nil
+ `(exwm-workspace--switch-history . ,(1+ current-idx))))
+ (workspace-idx (cl-position history-idx exwm-workspace--switch-history
+ :test #'equal)))
+ (elt exwm-workspace--list workspace-idx)))
+
+(defun exwm-workspace--prompt-add ()
+ "Add workspace from the prompt."
+ (interactive)
+ (when exwm-workspace--prompt-add-allowed
+ (let ((exwm-workspace--create-silently t))
+ (make-frame)
+ (run-hooks 'exwm-workspace-list-change-hook))
+ (exwm-workspace--update-switch-history)
+ (goto-history-element minibuffer-history-position)))
+
+(defun exwm-workspace--prompt-delete ()
+ "Delete workspace from the prompt."
+ (interactive)
+ (when (and exwm-workspace--prompt-delete-allowed
+ (< 1 (exwm-workspace--count)))
+ (let ((frame (elt exwm-workspace--list (1- minibuffer-history-position))))
+ (if (eq frame exwm-workspace--current)
+ ;; Abort the recursive minibuffer if deleting the current workspace.
+ (progn
+ (exwm--defer 0 #'exwm-workspace-delete frame)
+ (abort-recursive-edit))
+ (exwm-workspace-delete frame)
+ (exwm-workspace--update-switch-history)
+ (goto-history-element (min minibuffer-history-position
+ (exwm-workspace--count)))))))
+
+(defun exwm-workspace--update-switch-history ()
+ "Update the history for switching workspace to reflect the latest status."
+ (when exwm-workspace--switch-history-outdated
+ (setq exwm-workspace--switch-history-outdated nil)
+ (let* ((num (exwm-workspace--count))
+ (sequence (number-sequence 0 (1- num)))
+ (not-empty (make-vector num nil)))
+ (dolist (i exwm--id-buffer-alist)
+ (with-current-buffer (cdr i)
+ (when exwm--frame
+ (setf (aref not-empty
+ (exwm-workspace--position exwm--frame))
+ t))))
+ (setq exwm-workspace--switch-history
+ (mapcar
+ (lambda (i)
+ (mapconcat
+ (lambda (j)
+ (format (if (= i j) "[%s]" " %s ")
+ (propertize
+ (apply exwm-workspace-index-map (list j))
+ 'face
+ (cond ((frame-parameter (elt exwm-workspace--list j)
+ 'exwm-urgency)
+ '(:foreground "orange"))
+ ((aref not-empty j) '(:foreground "green"))
+ (t nil)))))
+ sequence ""))
+ sequence)))))
+
+(defun exwm-workspace--update-switch-by-name-map ()
+ "Updates `exwm-workspace--switch-by-name-map'."
+ (setcdr exwm-workspace--switch-by-name-map nil)
+ (unless (eq exwm-workspace-index-map #'number-to-string)
+ (dotimes (i 10)
+ (let ((key (funcall exwm-workspace-index-map i)))
+ (when (and (stringp key)
+ (length= key 1)
+ (<= 0 (elt key 0) 127))
+ (keymap-set exwm-workspace--switch-by-name-map key
+ (lambda ()
+ (interactive)
+ (exwm-workspace--switch-map-select-nth i))))))))
+
+(defun exwm-workspace--get-geometry (frame)
+ "Return the geometry of frame FRAME."
+ (or (frame-parameter frame 'exwm-geometry)
+ (make-instance 'xcb:RECTANGLE
+ :x 0
+ :y 0
+ :width (x-display-pixel-width)
+ :height (x-display-pixel-height))))
+
+(defun exwm-workspace--current-height ()
+ "Return the height of current workspace."
+ (let ((geometry (frame-parameter exwm-workspace--current 'exwm-geometry)))
+ (if geometry
+ (slot-value geometry 'height)
+ (x-display-pixel-height))))
+
+(defun exwm-workspace--minibuffer-own-frame-p ()
+ "Reports whether the minibuffer is displayed in its own frame."
+ (memq exwm-workspace-minibuffer-position '(top bottom)))
+
+(defun exwm-workspace--update-struts ()
+ "Update `exwm-workspace--struts'."
+ (setq exwm-workspace--struts nil)
+ (let (struts struts*)
+ (dolist (pair exwm-workspace--id-struts-alist)
+ (setq struts (cdr pair))
+ (when struts
+ (dotimes (i 4)
+ (when (/= 0 (aref struts i))
+ (setq struts*
+ (vector (aref [left right top bottom] i)
+ (aref struts i)
+ (when (= 12 (length struts))
+ (substring struts (+ 4 (* i 2)) (+ 6 (* i 2))))))
+ (if (= 0 (mod i 2))
+ ;; Make left/top processed first.
+ (push struts* exwm-workspace--struts)
+ (setq exwm-workspace--struts
+ (append exwm-workspace--struts (list struts*))))))))
+ (exwm--log "%s" exwm-workspace--struts)))
+
+(defun exwm-workspace--update-workareas ()
+ "Update `exwm-workspace--workareas'."
+ (let* ((root-width (x-display-pixel-width))
+ (root-height (x-display-pixel-height))
+ ;; Get workareas prior to struts.
+ (workareas (mapcar
+ (lambda (frame)
+ (if-let* ((rect (frame-parameter frame 'exwm-geometry)))
+ ;; Use the 'exwm-geometry' frame parameter if it
+ ;; exists. Make sure to clone it, will be modified
+ ;; below!
+ (clone rect)
+ ;; Fall back to use the screen size.
+ (make-instance 'xcb:RECTANGLE
+ :x 0
+ :y 0
+ :width root-width
+ :height root-height)))
+ exwm-workspace--list)))
+ ;; Exclude areas occupied by struts.
+ (dolist (struts exwm-workspace--struts)
+ (let* ((edge (aref struts 0))
+ (size (aref struts 1))
+ (position (aref struts 2))
+ (beg (and position (aref position 0)))
+ (end (and position (aref position 1)))
+ delta)
+ (dolist (w workareas)
+ (with-slots (x y width height) w
+ (pcase edge
+ ;; Left and top are always processed first.
+ ('left
+ (setq delta (- size x))
+ (when (and (< 0 delta)
+ (< delta width)
+ (or (not position)
+ (< (max beg y)
+ (min end (+ y height)))))
+ (cl-decf width delta)
+ (setf x size)))
+ ('right
+ (setq delta (- size (- root-width x width)))
+ (when (and (< 0 delta)
+ (< delta width)
+ (or (not position)
+ (< (max beg y)
+ (min end (+ y height)))))
+ (cl-decf width delta)))
+ ('top
+ (setq delta (- size y))
+ (when (and (< 0 delta)
+ (< delta height)
+ (or (not position)
+ (< (max beg x)
+ (min end (+ x width)))))
+ (cl-decf height delta)
+ (setf y size)))
+ ('bottom
+ (setq delta (- size (- root-height y height)))
+ (when (and (< 0 delta)
+ (< delta height)
+ (or (not position)
+ (< (max beg x)
+ (min end (+ x width)))))
+ (cl-decf height delta))))))))
+ ;; Save the result.
+ (setq exwm-workspace--workareas workareas)
+ (xcb:flush exwm--connection))
+ (exwm--log "%s" exwm-workspace--workareas)
+ (run-hooks 'exwm-workspace--update-workareas-hook))
+
+(defun exwm-workspace--update-offsets ()
+ "Update `exwm-workspace--frame-y-offset'/`exwm-workspace--window-y-offset'."
+ (exwm--log)
+ (if (not (and exwm-workspace--list
+ (or menu-bar-mode tool-bar-mode)))
+ (setq exwm-workspace--frame-y-offset 0
+ exwm-workspace--window-y-offset 0)
+ (redisplay t)
+ (let* ((frame (elt exwm-workspace--list 0))
+ (edges (window-inside-absolute-pixel-edges (frame-first-window
+ frame))))
+ (with-slots (y)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry
+ :drawable (frame-parameter frame
+ 'exwm-container)))
+ (with-slots ((y* y))
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry
+ :drawable (frame-parameter frame
+ 'exwm-outer-id)))
+ (with-slots ((y** y))
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry
+ :drawable (frame-parameter frame 'exwm-id)))
+ (setq exwm-workspace--frame-y-offset (- y** y*)
+ exwm-workspace--window-y-offset (- (elt edges 1) y))))))))
+
+(defun exwm-workspace--set-active (frame active)
+ "Make frame FRAME active on its monitor.
+ACTIVE indicates whether to set the frame active or inactive."
+ (exwm--log "active=%s; frame=%s" active frame)
+ (set-frame-parameter frame 'exwm-active active)
+ (if active
+ (exwm-workspace--set-fullscreen frame)
+ (exwm--set-geometry (frame-parameter frame 'exwm-container) nil nil 1 1))
+ (exwm-layout--refresh frame)
+ (xcb:flush exwm--connection))
+
+(defun exwm-workspace--active-p (frame)
+ "Return non-nil if FRAME is active."
+ (frame-parameter frame 'exwm-active))
+
+(defun exwm-workspace--set-fullscreen (frame)
+ "Make frame FRAME fullscreen according to `exwm-workspace--workareas'."
+ (exwm--log "frame=%s" frame)
+ (let ((id (frame-parameter frame 'exwm-outer-id))
+ (container (frame-parameter frame 'exwm-container)))
+ (with-slots (x y width height)
+ (exwm-workspace--workarea frame)
+ (exwm--log "x=%s; y=%s; w=%s; h=%s" x y width height)
+ (when (and (eq frame exwm-workspace--current)
+ (exwm-workspace--minibuffer-own-frame-p))
+ (exwm-workspace--resize-minibuffer-frame))
+ (if (exwm-workspace--active-p frame)
+ (exwm--set-geometry container x y width height)
+ (exwm--set-geometry container x y 1 1))
+ (exwm--set-geometry id nil nil width height)
+ (xcb:flush exwm--connection)))
+ ;; This is only used for workspace initialization.
+ (when exwm-workspace--fullscreen-frame-count
+ (cl-incf exwm-workspace--fullscreen-frame-count)))
+
+(defun exwm-workspace--resize-minibuffer-frame ()
+ "Resize minibuffer (and its container) to fit the size of workspace."
+ (cl-assert (exwm-workspace--minibuffer-own-frame-p))
+ (let ((workarea (exwm-workspace--workarea exwm-workspace-current-index))
+ (container (frame-parameter exwm-workspace--minibuffer
+ 'exwm-container))
+ y width)
+ (setq y (if (eq exwm-workspace-minibuffer-position 'top)
+ (- (slot-value workarea 'y)
+ exwm-workspace--attached-minibuffer-height)
+ ;; Reset the frame size.
+ (set-frame-height exwm-workspace--minibuffer 1)
+ (redisplay) ;FIXME.
+ (+ (slot-value workarea 'y) (slot-value workarea 'height)
+ (- (frame-pixel-height exwm-workspace--minibuffer))
+ exwm-workspace--attached-minibuffer-height))
+ width (slot-value workarea 'width))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window container
+ :value-mask (logior xcb:ConfigWindow:X
+ xcb:ConfigWindow:Y
+ xcb:ConfigWindow:Width
+ (if exwm-manage--desktop
+ xcb:ConfigWindow:Sibling
+ 0)
+ xcb:ConfigWindow:StackMode)
+ :x (slot-value workarea 'x)
+ :y y
+ :width width
+ :sibling exwm-manage--desktop
+ :stack-mode (if exwm-manage--desktop
+ xcb:StackMode:Above
+ xcb:StackMode:Below)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm-workspace--minibuffer
+ 'exwm-outer-id)
+ :value-mask xcb:ConfigWindow:Width
+ :width width))
+ (exwm--log "y: %s, width: %s" y width)))
+
+(defun exwm-workspace--switch-map-nth-prefix (&optional prefix-digits)
+ "Allow selecting a workspace by number.
+
+PREFIX-DIGITS is a list of the digits introduced so far."
+ (interactive)
+ (let* ((k (aref (substring (this-command-keys-vector) -1) 0))
+ (d (- k ?0))
+ ;; Convert prefix-digits to number. For example, '(2 1) to 120.
+ (o 1)
+ (pn (apply #'+ (mapcar (lambda (x)
+ (setq o (* 10 o))
+ (* o x))
+ prefix-digits)))
+ (n (+ pn d))
+ prefix-length index-max index-length)
+ (if (or (= n 0)
+ (> n
+ (setq index-max (1- (exwm-workspace--count))))
+ (>= (setq prefix-length (length prefix-digits))
+ (setq index-length (floor (log index-max 10))))
+ ;; Check if it's still possible to do a match.
+ (> (* n (expt 10 (- index-length prefix-length)))
+ index-max))
+ (exwm-workspace--switch-map-select-nth n)
+ ;; Go ahead if there are enough digits to select any workspace.
+ (set-transient-map
+ (let ((map (make-sparse-keymap))
+ (cmd (let ((digits (cons d prefix-digits)))
+ (lambda ()
+ (interactive)
+ (exwm-workspace--switch-map-nth-prefix digits)))))
+ (dotimes (i 10)
+ (keymap-set map (int-to-string i) cmd))
+ ;; Accept
+ (keymap-set map "<return>"
+ (lambda ()
+ (interactive)
+ (exwm-workspace--switch-map-select-nth n)))
+ map)))))
+
+(defun exwm-workspace--switch-map-select-nth (n)
+ "Select Nth workspace."
+ (interactive)
+ (goto-history-element (1+ n))
+ (exit-minibuffer))
+
+(defun exwm-workspace-switch (frame-or-index &optional force)
+ "Switch to workspace FRAME-OR-INDEX (0-based).
+
+Query for the index if not specified when called interactively. Passing a
+workspace frame as the first option or making use of the rest options are
+for internal use only.
+
+When FORCE is true, allow switching to current workspace."
+ (interactive
+ (list
+ (cond
+ ((null current-prefix-arg)
+ (unless (and (derived-mode-p 'exwm-mode)
+ ;; The prompt is invisible in fullscreen mode.
+ (exwm-layout--fullscreen-p))
+ (let ((exwm-workspace--prompt-add-allowed t)
+ (exwm-workspace--prompt-delete-allowed t))
+ (exwm-workspace--prompt-for-workspace "Switch to [+/-]: "))))
+ ((and (integerp current-prefix-arg)
+ (<= 0 current-prefix-arg (exwm-workspace--count)))
+ current-prefix-arg)
+ (t 0))))
+ (exwm--log)
+ (let* ((frame (exwm-workspace--workspace-from-frame-or-index frame-or-index))
+ (old-frame exwm-workspace--current)
+ (index (exwm-workspace--position frame))
+ (window (frame-parameter frame 'exwm-selected-window)))
+ (when (or force (not (eq frame exwm-workspace--current)))
+ (unless (window-live-p window)
+ (setq window (frame-selected-window frame)))
+ (when (and (not (eq frame old-frame))
+ (frame-live-p old-frame))
+ (with-selected-frame old-frame
+ (funcall exwm-workspace--original-handle-focus-out
+ (list 'focus-out frame))))
+ ;; Raise this frame.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter frame 'exwm-container)
+ :value-mask (logior xcb:ConfigWindow:Sibling
+ xcb:ConfigWindow:StackMode)
+ :sibling exwm--guide-window
+ :stack-mode xcb:StackMode:Below))
+ (setq exwm-workspace--current frame
+ exwm-workspace-current-index index)
+ (unless (exwm-workspace--workspace-p (selected-frame))
+ ;; Save the floating frame window selected on the previous workspace.
+ (set-frame-parameter (buffer-local-value 'exwm--frame (window-buffer))
+ 'exwm-selected-window (selected-window)))
+ ;; Show/Hide X windows.
+ (let ((monitor-old (frame-parameter old-frame 'exwm-randr-monitor))
+ (monitor-new (frame-parameter frame 'exwm-randr-monitor))
+ (active-old (exwm-workspace--active-p old-frame))
+ (active-new (exwm-workspace--active-p frame))
+ workspaces-to-hide)
+ (cond
+ ((not active-old)
+ (exwm-workspace--set-active frame t))
+ ((equal monitor-old monitor-new)
+ (exwm-workspace--set-active frame t)
+ (unless (eq frame old-frame)
+ (exwm-workspace--set-active old-frame nil)
+ (setq workspaces-to-hide (list old-frame))))
+ (active-new)
+ (t
+ (dolist (w exwm-workspace--list)
+ (when (and (exwm-workspace--active-p w)
+ (equal monitor-new
+ (frame-parameter w 'exwm-randr-monitor)))
+ (exwm-workspace--set-active w nil)
+ (setq workspaces-to-hide (append workspaces-to-hide (list w)))))
+ (exwm-workspace--set-active frame t)))
+ (dolist (i exwm--id-buffer-alist)
+ (with-current-buffer (cdr i)
+ (if (memq exwm--frame workspaces-to-hide)
+ (exwm-layout--hide exwm--id)
+ (when (eq frame exwm--frame)
+ (let ((window (get-buffer-window nil t)))
+ (when window
+ (exwm-layout--show exwm--id window))))))))
+ (select-window window)
+ (x-focus-frame (window-frame window)) ;The real input focus.
+ (set-frame-parameter frame 'exwm-selected-window nil)
+ (if (exwm-workspace--minibuffer-own-frame-p)
+ ;; Resize the minibuffer frame.
+ (exwm-workspace--resize-minibuffer-frame)
+ ;; Set a default minibuffer frame.
+ (setq default-minibuffer-frame frame))
+ ;; Hide windows in other workspaces by preprending a space
+ (unless exwm-workspace-show-all-buffers
+ (dolist (i exwm--id-buffer-alist)
+ (with-current-buffer (cdr i)
+ (let ((name (replace-regexp-in-string "^\\s-*" ""
+ (buffer-name))))
+ (exwm-workspace-rename-buffer (if (eq frame exwm--frame)
+ name
+ (concat " " name)))))))
+ ;; Update demands attention flag
+ (set-frame-parameter frame 'exwm-urgency nil)
+ ;; Update switch workspace history
+ (setq exwm-workspace--switch-history-outdated t)
+ ;; Set _NET_CURRENT_DESKTOP
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_CURRENT_DESKTOP
+ :window exwm--root :data index))
+ (xcb:flush exwm--connection))
+ (when exwm-workspace-warp-cursor
+ (with-slots (win-x win-y)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:QueryPointer
+ :window (frame-parameter frame
+ 'exwm-outer-id)))
+ (when (or (< win-x 0)
+ (< win-y 0)
+ (> win-x (frame-pixel-width frame))
+ (> win-y (frame-pixel-height frame)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:WarpPointer
+ :src-window xcb:Window:None
+ :dst-window (frame-parameter frame
+ 'exwm-outer-id)
+ :src-x 0
+ :src-y 0
+ :src-width 0
+ :src-height 0
+ :dst-x (/ (frame-pixel-width frame) 2)
+ :dst-y (/ (frame-pixel-height frame) 2)))
+ (xcb:flush exwm--connection))))
+ (funcall exwm-workspace--original-handle-focus-in (list 'focus-in frame))
+ (run-hooks 'exwm-workspace-switch-hook)))
+
+(defun exwm-workspace-switch-create (frame-or-index)
+ "Switch to workspace FRAME-OR-INDEX creating it first non-existent.
+
+Passing a workspace frame as the first option is for internal use only."
+ (interactive
+ (list
+ (cond
+ ((integerp current-prefix-arg)
+ current-prefix-arg)
+ (t 0))))
+ (unless frame-or-index
+ (setq frame-or-index 0))
+ (exwm--log "%s" frame-or-index)
+ (if (or (framep frame-or-index)
+ (< frame-or-index (exwm-workspace--count)))
+ (exwm-workspace-switch frame-or-index)
+ (let ((exwm-workspace--create-silently t))
+ (dotimes (_ (min exwm-workspace-switch-create-limit
+ (1+ (- frame-or-index
+ (exwm-workspace--count)))))
+ (make-frame))
+ (run-hooks 'exwm-workspace-list-change-hook))
+ (exwm-workspace-switch frame-or-index)))
+
+(defun exwm-workspace-swap (workspace1 workspace2)
+ "Interchange position of WORKSPACE1 with that of WORKSPACE2."
+ (interactive
+ (unless (and (derived-mode-p 'exwm-mode)
+ ;; The prompt is invisible in fullscreen mode.
+ (exwm-layout--fullscreen-p))
+ (let (w1 w2)
+ (let ((exwm-workspace--prompt-add-allowed t)
+ (exwm-workspace--prompt-delete-allowed t))
+ (setq w1 (exwm-workspace--prompt-for-workspace
+ "Pick a workspace [+/-]: ")))
+ (setq w2 (exwm-workspace--prompt-for-workspace
+ (format "Swap workspace %d with: "
+ (exwm-workspace--position w1))))
+ (list w1 w2))))
+ (exwm--log)
+ (let ((pos1 (exwm-workspace--position workspace1))
+ (pos2 (exwm-workspace--position workspace2)))
+ (if (or (not pos1) (not pos2) (= pos1 pos2))
+ (user-error "[EXWM] Cannot swap %s and %s" workspace1 workspace2)
+ (setf (elt exwm-workspace--list pos1) workspace2)
+ (setf (elt exwm-workspace--list pos2) workspace1)
+ ;; Update the _NET_WM_DESKTOP property of each X window affected.
+ (dolist (pair exwm--id-buffer-alist)
+ (when (memq (buffer-local-value 'exwm--frame (cdr pair))
+ (list workspace1 workspace2))
+ (exwm-workspace--set-desktop (car pair))))
+ (xcb:flush exwm--connection)
+ (when (memq exwm-workspace--current (list workspace1 workspace2))
+ ;; With the current workspace involved, lots of stuffs need refresh.
+ (set-frame-parameter exwm-workspace--current 'exwm-selected-window
+ (selected-window))
+ (exwm-workspace-switch exwm-workspace--current t))
+ (run-hooks 'exwm-workspace-list-change-hook))))
+
+(defun exwm-workspace-move (workspace nth)
+ "Move WORKSPACE to the NTH position.
+
+When called interactively, prompt for a workspace and move current one just
+before it."
+ (interactive
+ (cond
+ ((null current-prefix-arg)
+ (unless (and (derived-mode-p 'exwm-mode)
+ ;; The prompt is invisible in fullscreen mode.
+ (exwm-layout--fullscreen-p))
+ (list exwm-workspace--current
+ (exwm-workspace--position
+ (exwm-workspace--prompt-for-workspace "Move workspace to: ")))))
+ ((and (integerp current-prefix-arg)
+ (<= 0 current-prefix-arg (exwm-workspace--count)))
+ (list exwm-workspace--current current-prefix-arg))
+ (t (list exwm-workspace--current 0))))
+ (exwm--log)
+ (let ((pos (exwm-workspace--position workspace))
+ flag start end index)
+ (if (= nth pos)
+ (user-error "[EXWM] Cannot move to same position")
+ ;; Set if the current workspace is involved.
+ (setq flag (or (eq workspace exwm-workspace--current)
+ (eq (elt exwm-workspace--list nth)
+ exwm-workspace--current)))
+ ;; Do the move.
+ (with-no-warnings ;For Emacs 24.
+ (pop (nthcdr pos exwm-workspace--list)))
+ (push workspace (nthcdr nth exwm-workspace--list))
+ ;; Update the _NET_WM_DESKTOP property of each X window affected.
+ (setq start (min pos nth)
+ end (max pos nth))
+ (dolist (pair exwm--id-buffer-alist)
+ (setq index (exwm-workspace--position
+ (buffer-local-value 'exwm--frame (cdr pair))))
+ (unless (or (< index start) (> index end))
+ (exwm-workspace--set-desktop (car pair))))
+ (when flag
+ ;; With the current workspace involved, lots of stuffs need refresh.
+ (set-frame-parameter exwm-workspace--current 'exwm-selected-window
+ (selected-window))
+ (exwm-workspace-switch exwm-workspace--current t))
+ (run-hooks 'exwm-workspace-list-change-hook))))
+
+(defun exwm-workspace-add (&optional index)
+ "Add a workspace as the INDEX-th workspace, or the last one if INDEX is nil.
+
+INDEX must not exceed the current number of workspaces."
+ (interactive)
+ (exwm--log "%s" index)
+ (if (and index
+ ;; No need to move if it's the last one.
+ (< index (exwm-workspace--count)))
+ (exwm-workspace-move (make-frame) index)
+ (make-frame)))
+
+(defun exwm-workspace-delete (&optional frame-or-index)
+ "Delete the workspace FRAME-OR-INDEX."
+ (interactive)
+ (exwm--log "%s" frame-or-index)
+ (when (< 1 (exwm-workspace--count))
+ (let ((frame (if frame-or-index
+ (exwm-workspace--workspace-from-frame-or-index
+ frame-or-index)
+ exwm-workspace--current)))
+ ;; Transfer over any surrogate minibuffers before trying to delete the workspace.
+ (let ((minibuf (minibuffer-window frame))
+ (newminibuf (minibuffer-window (exwm-workspace--get-next-workspace frame))))
+ (dolist (f (filtered-frame-list (lambda (f) (eq (frame-parameter f 'minibuffer) minibuf))))
+ (set-frame-parameter f 'minibuffer newminibuf)))
+ (delete-frame frame))))
+
+(defun exwm-workspace--set-desktop (id)
+ "Set _NET_WM_DESKTOP for X window ID."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (let ((desktop (exwm-workspace--position exwm--frame)))
+ (setq exwm--desktop desktop)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_DESKTOP
+ :window id
+ :data desktop)))))
+
+(cl-defun exwm-workspace-move-window (frame-or-index &optional id)
+ "Move window ID to workspace FRAME-OR-INDEX."
+ (interactive (list
+ (cond
+ ((null current-prefix-arg)
+ (let ((exwm-workspace--prompt-add-allowed t)
+ (exwm-workspace--prompt-delete-allowed t))
+ (exwm-workspace--prompt-for-workspace "Move to [+/-]: ")))
+ ((and (integerp current-prefix-arg)
+ (<= 0 current-prefix-arg (exwm-workspace--count)))
+ current-prefix-arg)
+ (t 0))))
+ (let ((frame (exwm-workspace--workspace-from-frame-or-index frame-or-index))
+ old-frame container)
+ (unless id (setq id (exwm--buffer->id (window-buffer))))
+ (unless id
+ (cl-return-from exwm-workspace-move-window))
+ (exwm--log "Moving #x%x to %s" id frame-or-index)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (eq exwm--frame frame)
+ (unless exwm-workspace-show-all-buffers
+ (let ((name (replace-regexp-in-string "^\\s-*" "" (buffer-name))))
+ (exwm-workspace-rename-buffer
+ (if (eq frame exwm-workspace--current)
+ name
+ (concat " " name)))))
+ (setq old-frame exwm--frame
+ exwm--frame frame)
+ (if (not exwm--floating-frame)
+ ;; Tiling.
+ (if (get-buffer-window nil frame)
+ (when (eq frame exwm-workspace--current)
+ (exwm-layout--refresh frame))
+ (set-window-buffer (get-buffer-window nil t)
+ (other-buffer nil t))
+ (unless (eq frame exwm-workspace--current)
+ ;; Clear the 'exwm-selected-window' frame parameter.
+ (set-frame-parameter frame 'exwm-selected-window nil))
+ (set-window-buffer (frame-selected-window frame)
+ (exwm--id->buffer id))
+ (if (eq frame exwm-workspace--current)
+ (select-window (frame-selected-window frame))
+ (unless (exwm-workspace--active-p frame)
+ (exwm-layout--hide id))))
+ ;; Floating.
+ (setq container (frame-parameter exwm--floating-frame
+ 'exwm-container))
+ (unless (equal (frame-parameter old-frame 'exwm-randr-monitor)
+ (frame-parameter frame 'exwm-randr-monitor))
+ (with-slots (x y)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry
+ :drawable container))
+ (with-slots ((x1 x)
+ (y1 y))
+ (exwm-workspace--get-geometry old-frame)
+ (with-slots ((x2 x)
+ (y2 y))
+ (exwm-workspace--get-geometry frame)
+ (setq x (+ x (- x2 x1))
+ y (+ y (- y2 y1)))))
+ (exwm--set-geometry id x y nil nil)
+ (exwm--set-geometry container x y nil nil)))
+ (if (exwm-workspace--minibuffer-own-frame-p)
+ (if (eq frame exwm-workspace--current)
+ (select-window (frame-root-window exwm--floating-frame))
+ (select-window (frame-selected-window exwm-workspace--current))
+ (unless (exwm-workspace--active-p frame)
+ (exwm-layout--hide id)))
+ ;; The frame needs to be recreated since it won't use the
+ ;; minibuffer on the new workspace.
+ ;; The code is mostly copied from `exwm-floating--set-floating'.
+ (let* ((old-frame exwm--floating-frame)
+ (new-frame
+ (with-current-buffer
+ (or (get-buffer "*scratch*")
+ (progn
+ (set-buffer-major-mode
+ (get-buffer-create "*scratch*"))
+ (get-buffer "*scratch*")))
+ (make-frame
+ `((minibuffer . ,(minibuffer-window frame))
+ (left . ,(* window-min-width -100))
+ (top . ,(* window-min-height -100))
+ (width . ,window-min-width)
+ (height . ,window-min-height)
+ (unsplittable . t)))))
+ (outer-id (string-to-number
+ (frame-parameter new-frame
+ 'outer-window-id)))
+ (window-id (string-to-number
+ (frame-parameter new-frame 'window-id)))
+ (window (frame-root-window new-frame)))
+ (set-frame-parameter new-frame 'exwm-outer-id outer-id)
+ (set-frame-parameter new-frame 'exwm-id window-id)
+ (set-frame-parameter new-frame 'exwm-container container)
+ (make-frame-invisible new-frame)
+ (set-frame-size new-frame
+ (frame-pixel-width old-frame)
+ (frame-pixel-height old-frame)
+ t)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window outer-id
+ :parent container
+ :x 0 :y 0))
+ (xcb:flush exwm--connection)
+ (with-current-buffer (exwm--id->buffer id)
+ (setq window-size-fixed nil
+ exwm--floating-frame new-frame)
+ (set-window-dedicated-p (frame-root-window old-frame) nil)
+ (remove-hook 'window-configuration-change-hook
+ #'exwm-layout--refresh)
+ (set-window-buffer window (current-buffer))
+ (add-hook 'window-configuration-change-hook
+ #'exwm-layout--refresh)
+ (set-window-dedicated-p window t))
+ ;; Select a tiling window and delete the old frame.
+ (select-window (frame-selected-window exwm-workspace--current))
+ (delete-frame old-frame)
+ ;; The rest is the same.
+ (make-frame-visible new-frame)
+ (exwm--set-geometry outer-id 0 0 nil nil)
+ (xcb:flush exwm--connection)
+ (redisplay)
+ (if (eq frame exwm-workspace--current)
+ (with-current-buffer (exwm--id->buffer id)
+ (select-window (frame-root-window exwm--floating-frame)))
+ (unless (exwm-workspace--active-p frame)
+ (exwm-layout--hide id)))))
+ ;; Update the 'exwm-selected-window' frame parameter.
+ (when (not (eq frame exwm-workspace--current))
+ (with-current-buffer (exwm--id->buffer id)
+ (set-frame-parameter frame 'exwm-selected-window
+ (frame-root-window
+ exwm--floating-frame)))))
+ ;; Set _NET_WM_DESKTOP.
+ (exwm-workspace--set-desktop id)
+ (xcb:flush exwm--connection)))
+ (setq exwm-workspace--switch-history-outdated t)))
+
+(defun exwm-workspace-switch-to-buffer (buffer-or-name)
+ "Make selected window display BUFFER-OR-NAME."
+ (interactive
+ (let ((inhibit-quit t))
+ ;; Show all buffers
+ (unless exwm-workspace-show-all-buffers
+ (dolist (pair exwm--id-buffer-alist)
+ (with-current-buffer (cdr pair)
+ (when (= ?\s (aref (buffer-name) 0))
+ (let ((buffer-list-update-hook
+ (remq #'exwm-input--on-buffer-list-update
+ buffer-list-update-hook)))
+ (rename-buffer (substring (buffer-name) 1)))))))
+ (prog1
+ (with-local-quit
+ (list (get-buffer (read-buffer-to-switch "Switch to buffer: "))))
+ ;; Hide buffers on other workspaces
+ (unless exwm-workspace-show-all-buffers
+ (dolist (pair exwm--id-buffer-alist)
+ (with-current-buffer (cdr pair)
+ (unless (or (eq exwm--frame exwm-workspace--current)
+ (= ?\s (aref (buffer-name) 0)))
+ (let ((buffer-list-update-hook
+ (remq #'exwm-input--on-buffer-list-update
+ buffer-list-update-hook)))
+ (rename-buffer (concat " " (buffer-name)))))))))))
+ (exwm--log)
+ (when buffer-or-name
+ (with-current-buffer buffer-or-name
+ (if (derived-mode-p 'exwm-mode)
+ ;; EXWM buffer.
+ (if (eq exwm--frame exwm-workspace--current)
+ ;; On the current workspace.
+ (if (not exwm--floating-frame)
+ (switch-to-buffer buffer-or-name)
+ ;; Select the floating frame.
+ (select-frame-set-input-focus exwm--floating-frame)
+ (select-window (frame-root-window exwm--floating-frame)))
+ ;; On another workspace.
+ (if exwm-layout-show-all-buffers
+ (exwm-workspace-move-window exwm-workspace--current
+ exwm--id)
+ (let ((window (get-buffer-window buffer-or-name exwm--frame)))
+ (if window
+ (set-frame-parameter exwm--frame
+ 'exwm-selected-window window)
+ (set-window-buffer (frame-selected-window exwm--frame)
+ buffer-or-name)))
+ (exwm-workspace-switch exwm--frame)))
+ ;; Ordinary buffer.
+ (switch-to-buffer buffer-or-name)))))
+
+(defun exwm-workspace-rename-buffer (newname)
+ "Rename current buffer to NEWNAME."
+ (let ((hidden (= ?\s (aref newname 0)))
+ (basename (replace-regexp-in-string "<[0-9]+>$" "" newname))
+ (counter 1)
+ tmp)
+ (when hidden (setq basename (substring basename 1)))
+ (setq newname basename)
+ (while (and (setq tmp (or (get-buffer newname)
+ (get-buffer (concat " " newname))))
+ (not (eq tmp (current-buffer))))
+ (setq newname (format "%s<%d>" basename (cl-incf counter))))
+ (let ((buffer-list-update-hook
+ (remq #'exwm-input--on-buffer-list-update
+ buffer-list-update-hook)))
+ (rename-buffer (concat (and hidden " ") newname)))))
+
+(defun exwm-workspace--x-create-frame (orig-x-create-frame params)
+ "Set override-redirect on the frame created by `x-create-frame'.
+ORIG-X-CREATE-FRAME is the advised function `x-create-frame'.
+PARAMS are the original arguments."
+ (exwm--log)
+ (let ((frame (funcall orig-x-create-frame params)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window (string-to-number
+ (frame-parameter frame 'outer-window-id))
+ :value-mask xcb:CW:OverrideRedirect
+ :override-redirect 1))
+ (xcb:flush exwm--connection)
+ frame))
+
+(defsubst exwm-workspace--minibuffer-attached-p ()
+ "Return non-nil if the minibuffer is attached.
+
+Please check `exwm-workspace--minibuffer-own-frame-p' first."
+ (assq (frame-parameter exwm-workspace--minibuffer 'exwm-container)
+ exwm-workspace--id-struts-alist))
+
+(defun exwm-workspace-attach-minibuffer ()
+ "Attach the minibuffer making it always visible."
+ (interactive)
+ (exwm--log)
+ (when (and (exwm-workspace--minibuffer-own-frame-p)
+ (not (exwm-workspace--minibuffer-attached-p)))
+ ;; Reset the frame size.
+ (set-frame-height exwm-workspace--minibuffer 1)
+ (redisplay) ;FIXME.
+ (setq exwm-workspace--attached-minibuffer-height
+ (frame-pixel-height exwm-workspace--minibuffer))
+ (exwm-workspace--show-minibuffer)
+ (let ((container (frame-parameter exwm-workspace--minibuffer
+ 'exwm-container)))
+ (push (cons container
+ (if (eq exwm-workspace-minibuffer-position 'top)
+ (vector 0 0 exwm-workspace--attached-minibuffer-height 0)
+ (vector 0 0 0 exwm-workspace--attached-minibuffer-height)))
+ exwm-workspace--id-struts-alist)
+ (exwm-workspace--update-struts)
+ (exwm-workspace--update-workareas)
+ (dolist (f exwm-workspace--list)
+ (exwm-workspace--set-fullscreen f)))))
+
+(defun exwm-workspace-detach-minibuffer ()
+ "Detach the minibuffer so that it automatically hides."
+ (interactive)
+ (exwm--log)
+ (when (and (exwm-workspace--minibuffer-own-frame-p)
+ (exwm-workspace--minibuffer-attached-p))
+ (setq exwm-workspace--attached-minibuffer-height 0)
+ (let ((container (frame-parameter exwm-workspace--minibuffer
+ 'exwm-container)))
+ (setq exwm-workspace--id-struts-alist
+ (assq-delete-all container exwm-workspace--id-struts-alist))
+ (exwm-workspace--update-struts)
+ (exwm-workspace--update-workareas)
+ (dolist (f exwm-workspace--list)
+ (exwm-workspace--set-fullscreen f))
+ (exwm-workspace--hide-minibuffer))))
+
+(defun exwm-workspace-toggle-minibuffer ()
+ "Attach the minibuffer if it's detached, or detach it if it's attached."
+ (interactive)
+ (exwm--log)
+ (when (exwm-workspace--minibuffer-own-frame-p)
+ (if (exwm-workspace--minibuffer-attached-p)
+ (exwm-workspace-detach-minibuffer)
+ (exwm-workspace-attach-minibuffer))))
+
+(defun exwm-workspace--update-minibuffer-height (&optional echo-area)
+ "Update the minibuffer frame height.
+When ECHO-AREA is non-nil, take the size of the echo area into
+account when calculating the height."
+ (when (exwm--terminal-p)
+ (let ((height
+ (with-current-buffer
+ (window-buffer (minibuffer-window exwm-workspace--minibuffer))
+ (max 1
+ (if echo-area
+ (let ((width (frame-width exwm-workspace--minibuffer))
+ (result 0))
+ (mapc (lambda (i)
+ (setq result
+ (+ result
+ (ceiling (1+ (length i)) width))))
+ (split-string (or (current-message) "") "\n"))
+ result)
+ (count-screen-lines))))))
+ (when (and (integerp max-mini-window-height)
+ (> height max-mini-window-height))
+ (setq height max-mini-window-height))
+ (exwm--log "%s" height)
+ (set-frame-height exwm-workspace--minibuffer height))))
+
+(defun exwm-workspace--on-ConfigureNotify (data _synthetic)
+ "Adjust the container to fit the minibuffer frame.
+DATA contains unmarshalled ConfigureNotify event data."
+ (let ((obj (make-instance 'xcb:ConfigureNotify)) y)
+ (xcb:unmarshal obj data)
+ (with-slots (window height) obj
+ (when (eq (frame-parameter exwm-workspace--minibuffer 'exwm-outer-id)
+ window)
+ (exwm--log)
+ (when (and (floatp max-mini-window-height)
+ (> height (* max-mini-window-height
+ (exwm-workspace--current-height))))
+ (setq height (floor
+ (* max-mini-window-height
+ (exwm-workspace--current-height))))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window window
+ :value-mask xcb:ConfigWindow:Height
+ :height height)))
+ (when (/= (exwm-workspace--count) (length exwm-workspace--workareas))
+ ;; There is a chance the workareas are not updated timely.
+ (exwm-workspace--update-workareas))
+ (with-slots ((y* y) (height* height))
+ (exwm-workspace--workarea exwm-workspace-current-index)
+ (setq y (if (eq exwm-workspace-minibuffer-position 'top)
+ (- y*
+ exwm-workspace--attached-minibuffer-height)
+ (+ y* height* (- height)
+ exwm-workspace--attached-minibuffer-height))))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm-workspace--minibuffer
+ 'exwm-container)
+ :value-mask (logior xcb:ConfigWindow:Y
+ xcb:ConfigWindow:Height)
+ :y y
+ :height height))
+ (xcb:flush exwm--connection)))))
+
+(defun exwm-workspace--display-buffer (buffer alist)
+ "Display BUFFER as if the current workspace were selected.
+ALIST is an action alist, as accepted by function `display-buffer'."
+ ;; Only when the floating minibuffer frame is selected.
+ ;; This also protect this functions from being recursively called.
+ (when (eq (selected-frame) exwm-workspace--minibuffer)
+ (with-selected-frame exwm-workspace--current
+ (display-buffer buffer alist))))
+
+(defun exwm-workspace--show-minibuffer ()
+ "Show the minibuffer frame."
+ (exwm--log)
+ ;; Cancel pending timer.
+ (when exwm-workspace--display-echo-area-timer
+ (cancel-timer exwm-workspace--display-echo-area-timer)
+ (setq exwm-workspace--display-echo-area-timer nil))
+ ;; Show the minibuffer frame.
+ (unless (exwm-workspace--minibuffer-attached-p)
+ (exwm--set-geometry (frame-parameter exwm-workspace--minibuffer
+ 'exwm-container)
+ nil nil
+ (frame-pixel-width exwm-workspace--minibuffer)
+ (frame-pixel-height exwm-workspace--minibuffer)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm-workspace--minibuffer
+ 'exwm-container)
+ :value-mask xcb:ConfigWindow:StackMode
+ :stack-mode xcb:StackMode:Above))
+ (xcb:flush exwm--connection))
+
+(defun exwm-workspace--hide-minibuffer ()
+ "Hide the minibuffer frame."
+ (exwm--log)
+ ;; Hide the minibuffer frame.
+ (if (exwm-workspace--minibuffer-attached-p)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window (frame-parameter exwm-workspace--minibuffer
+ 'exwm-container)
+ :value-mask (logior (if exwm-manage--desktop
+ xcb:ConfigWindow:Sibling
+ 0)
+ xcb:ConfigWindow:StackMode)
+ :sibling exwm-manage--desktop
+ :stack-mode (if exwm-manage--desktop
+ xcb:StackMode:Above
+ xcb:StackMode:Below)))
+ (exwm--set-geometry (frame-parameter exwm-workspace--minibuffer
+ 'exwm-container)
+ nil nil 1 1))
+ (xcb:flush exwm--connection))
+
+(defun exwm-workspace--on-minibuffer-setup ()
+ "Run in `minibuffer-setup-hook' to show the minibuffer and its container."
+ (exwm--log)
+ (when (and (= 1 (minibuffer-depth))
+ (exwm--terminal-p))
+ (add-hook 'post-command-hook #'exwm-workspace--update-minibuffer-height)
+ (exwm-workspace--show-minibuffer))
+ ;; FIXME: This is a temporary fix for the *Completions* buffer not
+ ;; being correctly fitted by its displaying window. As with
+ ;; `exwm-workspace--display-buffer', the problem is caused by
+ ;; the fact that the minibuffer (rather than the workspace)
+ ;; frame is the 'selected frame'. `get-buffer-window' will
+ ;; fail to retrieve the correct window. It's likely there are
+ ;; other related issues.
+ ;; This is not required by Emacs 24.
+ (let ((window (get-buffer-window "*Completions*" exwm-workspace--current)))
+ (when window
+ (fit-window-to-buffer window)
+ (window-preserve-size window))))
+
+(defun exwm-workspace--on-minibuffer-exit ()
+ "Run in `minibuffer-exit-hook' to hide the minibuffer container."
+ (exwm--log)
+ (when (and (= 1 (minibuffer-depth))
+ (exwm--terminal-p))
+ (remove-hook 'post-command-hook #'exwm-workspace--update-minibuffer-height)
+ (exwm-workspace--hide-minibuffer)))
+
+(defun exwm-workspace--on-echo-area-dirty ()
+ "Run when new message arrives to show the echo area and its container."
+ (when (and (not (active-minibuffer-window))
+ (or (current-message)
+ cursor-in-echo-area)
+ (exwm--terminal-p))
+ (exwm-workspace--update-minibuffer-height t)
+ (exwm-workspace--show-minibuffer)
+ (unless (or (not exwm-workspace-display-echo-area-timeout)
+ real-this-command ;e.g. read-event
+ input-method-use-echo-area)
+ (setq exwm-workspace--display-echo-area-timer
+ (run-with-timer exwm-workspace-display-echo-area-timeout nil
+ #'exwm-workspace--echo-area-maybe-clear)))))
+
+(defun exwm-workspace--echo-area-maybe-clear ()
+ "Eventually clear the echo area container."
+ (exwm--log)
+ (if (not (current-message))
+ (exwm-workspace--on-echo-area-clear)
+ ;; Reschedule.
+ (cancel-timer exwm-workspace--display-echo-area-timer)
+ (setq exwm-workspace--display-echo-area-timer
+ (run-with-timer exwm-workspace-display-echo-area-timeout nil
+ #'exwm-workspace--echo-area-maybe-clear))))
+
+(defun exwm-workspace--on-echo-area-clear ()
+ "Run in `echo-area-clear-hook' to hide echo area container."
+ (when (exwm--terminal-p)
+ (unless (active-minibuffer-window)
+ (exwm-workspace--hide-minibuffer))
+ (when exwm-workspace--display-echo-area-timer
+ (cancel-timer exwm-workspace--display-echo-area-timer)
+ (setq exwm-workspace--display-echo-area-timer nil))))
+
+(defun exwm-workspace--set-desktop-geometry ()
+ "Set _NET_DESKTOP_GEOMETRY."
+ (exwm--log)
+ ;; We don't support large desktop so it's the same with screen size.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_DESKTOP_GEOMETRY
+ :window exwm--root
+ :width (x-display-pixel-width)
+ :height (x-display-pixel-height))))
+
+(defun exwm-workspace--add-frame-as-workspace (frame)
+ "Configure frame FRAME to be treated as a workspace."
+ (exwm--log "%s" frame)
+ (setq exwm-workspace--list (nconc exwm-workspace--list (list frame)))
+ (let ((outer-id (string-to-number (frame-parameter frame
+ 'outer-window-id)))
+ (window-id (string-to-number (frame-parameter frame 'window-id)))
+ (container (xcb:generate-id exwm--connection))
+ frame-colormap frame-visual frame-depth)
+ ;; Save window IDs
+ (set-frame-parameter frame 'exwm-outer-id outer-id)
+ (set-frame-parameter frame 'exwm-id window-id)
+ (set-frame-parameter frame 'exwm-container container)
+ ;; Copy RandR frame parameters from the first workspace to
+ ;; prevent potential problems. The values do not matter here as
+ ;; they'll be updated by the RandR module later.
+ (let ((w (car exwm-workspace--list)))
+ (dolist (param '(exwm-randr-monitor
+ exwm-geometry))
+ (set-frame-parameter frame param (frame-parameter w param))))
+ ;; Support transparency on the container X window when the Emacs frame
+ ;; does. Note that in addition to setting the visual, colormap and depth
+ ;; we must also reset the `:border-pixmap', as its default value is
+ ;; relative to the parent window, which might have a different depth.
+ (let* ((vdc (exwm--get-visual-depth-colormap exwm--connection outer-id)))
+ (setq frame-visual (car vdc))
+ (setq frame-depth (cadr vdc))
+ (setq frame-colormap (caddr vdc)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:CreateWindow
+ :depth frame-depth
+ :wid container
+ :parent exwm--root
+ :x -1
+ :y -1
+ :width 1
+ :height 1
+ :border-width 0
+ :class xcb:WindowClass:InputOutput
+ :visual frame-visual
+ :value-mask (logior xcb:CW:BackPixmap
+ xcb:CW:BorderPixel
+ xcb:CW:Colormap
+ xcb:CW:OverrideRedirect)
+ :background-pixmap xcb:BackPixmap:None
+ :border-pixel 0
+ :colormap frame-colormap
+ :override-redirect 1))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ConfigureWindow
+ :window container
+ :value-mask xcb:ConfigWindow:StackMode
+ :stack-mode xcb:StackMode:Below))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window container
+ :data
+ (format "EXWM workspace %d frame container"
+ (exwm-workspace--position frame))))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window outer-id :parent container :x 0 :y 0))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:icccm:set-WM_STATE
+ :window outer-id
+ :state xcb:icccm:WM_STATE:NormalState
+ :icon xcb:Window:None))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:MapWindow :window container)))
+ (xcb:flush exwm--connection)
+ ;; Delay making the workspace fullscreen until Emacs becomes idle
+ (exwm--defer 0 #'exwm-workspace--fullscreen-workspace frame)
+ ;; Update EWMH properties.
+ (exwm-workspace--update-ewmh-props)
+ (if exwm-workspace--create-silently
+ (setq exwm-workspace--switch-history-outdated t)
+ (let ((original-index exwm-workspace-current-index))
+ (exwm-workspace-switch frame t)
+ (message "Created %s as workspace %d; switched from %d"
+ frame exwm-workspace-current-index original-index))
+ (run-hooks 'exwm-workspace-list-change-hook)))
+
+(defun exwm-workspace--get-next-workspace (frame)
+ "Return the next workspace if workspace FRAME were removed.
+Return nil if FRAME is the only workspace."
+ (let* ((index (exwm-workspace--position frame))
+ (lastp (= index (1- (exwm-workspace--count))))
+ (nextw (elt exwm-workspace--list (+ index (if lastp -1 +1)))))
+ (unless (eq frame nextw)
+ nextw)))
+
+(defun exwm-workspace--remove-frame-as-workspace (frame &optional quit)
+ "Stop treating FRAME as a workspace.
+When QUIT is non-nil cleanup avoid communicating with the X server."
+ ;; TODO: restore all frame parameters (e.g. exwm-workspace, buffer-predicate,
+ ;; etc)
+ (exwm--log "Removing frame `%s' as workspace" frame)
+ (unless quit
+ (let* ((next-frame (exwm-workspace--get-next-workspace frame))
+ (following-frames (cdr (memq frame exwm-workspace--list))))
+ ;; Need to remove the workspace from the list for the correct calculation of
+ ;; indexes below.
+ (setq exwm-workspace--list (delete frame exwm-workspace--list))
+ ;; Move the windows to the next workspace and switch to it.
+ (unless next-frame
+ ;; The user managed to delete the last workspace, so create a new one.
+ (exwm--log "Last workspace deleted; create a new one")
+ (let ((exwm-workspace--create-silently t))
+ (setq next-frame (make-frame))))
+ (dolist (pair exwm--id-buffer-alist)
+ (let ((other-frame (buffer-local-value 'exwm--frame (cdr pair))))
+ ;; Move X windows to next-frame.
+ (when (eq other-frame frame)
+ (exwm-workspace-move-window next-frame (car pair)))
+ ;; Update the _NET_WM_DESKTOP property of each following X window.
+ (when (memq other-frame following-frames)
+ (exwm-workspace--set-desktop (car pair)))))
+ ;; If the current workspace is deleted, switch to next one.
+ (when (eq frame exwm-workspace--current)
+ (exwm-workspace-switch next-frame))))
+ ;; Reparent out the frame.
+ (let ((outer-id (frame-parameter frame 'exwm-outer-id)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:UnmapWindow
+ :window outer-id))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window outer-id
+ :parent exwm--root
+ :x 0
+ :y 0))
+ ;; Reset the override-redirect.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window outer-id
+ :value-mask xcb:CW:OverrideRedirect
+ :override-redirect 0))
+ ;; Remove fullscreen state.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_STATE
+ :window outer-id
+ :data nil))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:MapWindow
+ :window outer-id)))
+ ;; Destroy the container.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:DestroyWindow
+ :window (frame-parameter frame 'exwm-container)))
+ (xcb:flush exwm--connection)
+ ;; Update EWMH properties.
+ (exwm-workspace--update-ewmh-props)
+ ;; Update switch history.
+ (unless quit
+ (setq exwm-workspace--switch-history-outdated t)
+ (run-hooks 'exwm-workspace-list-change-hook)))
+
+(defun exwm-workspace--on-delete-frame (frame)
+ "Hook run upon `delete-frame' removing FRAME as a workspace."
+ (cond
+ ((not (exwm-workspace--workspace-p frame))
+ (exwm--log "Frame `%s' is not a workspace" frame))
+ (t
+ (exwm-workspace--remove-frame-as-workspace frame))))
+
+(defun exwm-workspace--fullscreen-workspace (frame)
+ "Make workspace FRAME fullscreen.
+Called from a timer."
+ (when (frame-live-p frame)
+ (set-frame-parameter frame 'fullscreen 'fullboth)))
+
+(defun exwm-workspace--on-after-make-frame (frame)
+ "Hook run upon `make-frame' that configures FRAME as a workspace."
+ (cond
+ ((exwm-workspace--workspace-p frame)
+ (exwm--log "Frame `%s' is already a workspace" frame))
+ ((not (display-graphic-p frame))
+ (exwm--log "Frame `%s' is not graphical" frame))
+ ((not (eq (frame-terminal) exwm--terminal))
+ (exwm--log "Frame `%s' is on a different terminal (%S instead of %S)"
+ frame
+ (frame-terminal frame)
+ exwm--terminal))
+ ((not (string-equal
+ (replace-regexp-in-string "\\.0$" ""
+ (slot-value exwm--connection 'display))
+ (replace-regexp-in-string "\\.0$" ""
+ (frame-parameter frame 'display))))
+ (exwm--log "Frame `%s' is on a different DISPLAY (%S instead of %S)"
+ frame
+ (frame-parameter frame 'display)
+ (slot-value exwm--connection 'display)))
+ ((frame-parameter frame 'unsplittable)
+ ;; We create floating frames with the "unsplittable" parameter set.
+ ;; Though it may not be a floating frame, we won't treat an
+ ;; unsplittable frame as a workspace anyway.
+ (exwm--log "Frame `%s' is floating" frame))
+ (t
+ (exwm--log "Adding frame `%s' as workspace" frame)
+ (exwm-workspace--add-frame-as-workspace frame))))
+
+(defun exwm-workspace--update-ewmh-props ()
+ "Update EWMH properties to match the workspace list."
+ (exwm--log)
+ (let ((num-workspaces (exwm-workspace--count)))
+ ;; Avoid setting 0 desktops.
+ (when (= 0 num-workspaces)
+ (setq num-workspaces 1))
+ ;; Set _NET_NUMBER_OF_DESKTOPS.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_NUMBER_OF_DESKTOPS
+ :window exwm--root :data num-workspaces))
+ ;; Set _NET_DESKTOP_GEOMETRY.
+ (exwm-workspace--set-desktop-geometry)
+ ;; Update workareas.
+ (exwm-workspace--update-workareas))
+ (xcb:flush exwm--connection))
+
+(defun exwm-workspace--modify-all-x-frames-parameters (new-x-parameters)
+ "Modifies `window-system-default-frame-alist' for the X Window System.
+NEW-X-PARAMETERS is an alist of frame parameters, merged into current
+`window-system-default-frame-alist' for the X Window System. The parameters are
+applied to all subsequently created X frames."
+ (exwm--log)
+ ;; The parameters are modified in place; take current
+ ;; ones or insert a new X-specific list.
+ (let ((x-parameters (or (assq 'x window-system-default-frame-alist)
+ (let ((new-x-parameters '(x)))
+ (push new-x-parameters
+ window-system-default-frame-alist)
+ new-x-parameters))))
+ (setf (cdr x-parameters)
+ (append new-x-parameters (cdr x-parameters)))))
+
+(defun exwm-workspace--handle-focus-in (_orig-func _event)
+ "Replacement for `handle-focus-in'."
+ (interactive "e"))
+
+(defun exwm-workspace--handle-focus-out (_orig-func _event)
+ "Replacement for `handle-focus-out'."
+ (interactive "e"))
+
+(defun exwm-workspace--init-minibuffer-frame ()
+ "Initialize minibuffer-only frame."
+ (exwm--log)
+ ;; Initialize workspaces without minibuffers.
+ (setq exwm-workspace--minibuffer
+ (make-frame '((window-system . x) (minibuffer . only)
+ (left . 10000) (right . 10000)
+ (width . 1) (height . 1))))
+ ;; This is the only usable minibuffer frame.
+ (setq default-minibuffer-frame exwm-workspace--minibuffer)
+ (exwm-workspace--modify-all-x-frames-parameters
+ '((minibuffer . nil)))
+ (let ((outer-id (string-to-number
+ (frame-parameter exwm-workspace--minibuffer
+ 'outer-window-id)))
+ (window-id (string-to-number
+ (frame-parameter exwm-workspace--minibuffer
+ 'window-id)))
+ (container (xcb:generate-id exwm--connection)))
+ (set-frame-parameter exwm-workspace--minibuffer
+ 'exwm-outer-id outer-id)
+ (set-frame-parameter exwm-workspace--minibuffer 'exwm-id window-id)
+ (set-frame-parameter exwm-workspace--minibuffer 'exwm-container
+ container)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:CreateWindow
+ :depth 0
+ :wid container
+ :parent exwm--root
+ :x 0
+ :y 0
+ :width 1
+ :height 1
+ :border-width 0
+ :class xcb:WindowClass:InputOutput
+ :visual 0
+ :value-mask (logior xcb:CW:BackPixmap
+ xcb:CW:OverrideRedirect)
+ :background-pixmap xcb:BackPixmap:ParentRelative
+ :override-redirect 1))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window container
+ :data "EXWM minibuffer container"))
+ ;; Reparent the minibuffer frame to the container.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window outer-id :parent container :x 0 :y 0))
+ ;; Map the container.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:MapWindow
+ :window container))
+ ;; Attach event listener for monitoring the frame
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window outer-id
+ :value-mask xcb:CW:EventMask
+ :event-mask xcb:EventMask:StructureNotify))
+ (xcb:+event exwm--connection 'xcb:ConfigureNotify
+ #'exwm-workspace--on-ConfigureNotify))
+ ;; Show/hide minibuffer / echo area when they're active/inactive.
+ (add-hook 'minibuffer-setup-hook #'exwm-workspace--on-minibuffer-setup)
+ (add-hook 'minibuffer-exit-hook #'exwm-workspace--on-minibuffer-exit)
+ (setq exwm-workspace--timer
+ (run-with-idle-timer 0 t #'exwm-workspace--on-echo-area-dirty))
+ (add-hook 'echo-area-clear-hook #'exwm-workspace--on-echo-area-clear)
+ ;; The default behavior of `display-buffer' (indirectly called by
+ ;; `minibuffer-completion-help') is not correct here.
+ (cl-pushnew '(exwm-workspace--display-buffer) display-buffer-alist
+ :test #'equal))
+
+(defun exwm-workspace--exit-minibuffer-frame ()
+ "Cleanup minibuffer-only frame."
+ (exwm--log)
+ ;; Only on minibuffer-frame.
+ (remove-hook 'minibuffer-setup-hook #'exwm-workspace--on-minibuffer-setup)
+ (remove-hook 'minibuffer-exit-hook #'exwm-workspace--on-minibuffer-exit)
+ (remove-hook 'echo-area-clear-hook #'exwm-workspace--on-echo-area-clear)
+ (when exwm-workspace--display-echo-area-timer
+ (cancel-timer exwm-workspace--display-echo-area-timer))
+ (when exwm-workspace--timer
+ (cancel-timer exwm-workspace--timer)
+ (setq exwm-workspace--timer nil))
+ (setq display-buffer-alist
+ (cl-delete '(exwm-workspace--display-buffer) display-buffer-alist
+ :test #'equal))
+ (setq default-minibuffer-frame nil)
+ (when (frame-live-p exwm-workspace--minibuffer) ; might be already dead
+ (let ((id (frame-parameter exwm-workspace--minibuffer 'exwm-outer-id)))
+ (when (and exwm-workspace--minibuffer id
+ ;; Invoked from `exwm-manage--exit' upon disconnection.
+ (slot-value exwm--connection 'connected))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ReparentWindow
+ :window id
+ :parent exwm--root
+ :x 0
+ :y 0)))
+ (setq exwm-workspace--minibuffer nil))))
+
+(defun exwm-workspace--init ()
+ "Initialize workspace module."
+ (exwm--log)
+ ;; Re-initialize the workspace switch-by-name map just in case
+ ;; the user customized it via setq instead of setopt. This preserves
+ ;; existing behavior and doesn't really add any complexity.
+ (exwm-workspace--update-switch-by-name-map)
+ ;; Prevent unexpected exit
+ (setq exwm-workspace--fullscreen-frame-count 0)
+ (exwm-workspace--modify-all-x-frames-parameters
+ '((internal-border-width . 0)))
+ (let ((initial-workspaces (frame-list)))
+ (if (not (exwm-workspace--minibuffer-own-frame-p))
+ ;; Initialize workspaces with minibuffers.
+ (when (< 1 (length initial-workspaces))
+ ;; Exclude the initial frame.
+ (dolist (i initial-workspaces)
+ (unless (frame-parameter i 'window-id)
+ (setq initial-workspaces (delq i initial-workspaces))))
+ (let ((f (car initial-workspaces)))
+ ;; Remove the possible internal border.
+ (set-frame-parameter f 'internal-border-width 0)))
+ (exwm-workspace--init-minibuffer-frame)
+ ;; Remove/hide existing frames.
+ (dolist (f initial-workspaces)
+ (when (eq 'x (framep f)) ;do not delete the initial frame.
+ (delete-frame f)))
+ ;; Recreate one frame with the external minibuffer set.
+ (setq initial-workspaces (list (make-frame '((window-system . x))))))
+ ;; Prevent `other-buffer' from selecting already displayed EXWM buffers.
+ (modify-all-frames-parameters
+ '((buffer-predicate . exwm-layout--other-buffer-predicate)))
+ ;; Create remaining workspaces.
+ (dotimes (_ (- exwm-workspace-number (length initial-workspaces)))
+ (nconc initial-workspaces (list (make-frame '((window-system . x))))))
+ ;; Configure workspaces
+ (let ((exwm-workspace--create-silently t))
+ (dolist (i initial-workspaces)
+ (exwm-workspace--add-frame-as-workspace i))))
+ (xcb:flush exwm--connection)
+ ;; We have to advice `x-create-frame' or every call to it would hang EXWM
+ (advice-add 'x-create-frame :around #'exwm-workspace--x-create-frame)
+ ;; We have to manually handle focus-in and focus-out events for Emacs
+ ;; frames.
+ (advice-add 'handle-focus-in :around #'exwm-workspace--handle-focus-in)
+ (advice-add 'handle-focus-out :around #'exwm-workspace--handle-focus-out)
+ ;; Make new frames create new workspaces.
+ (add-hook 'after-make-frame-functions
+ #'exwm-workspace--on-after-make-frame)
+ (add-hook 'delete-frame-functions #'exwm-workspace--on-delete-frame)
+ (when (exwm-workspace--minibuffer-own-frame-p)
+ (add-hook 'exwm-input--event-hook
+ #'exwm-workspace--on-echo-area-clear))
+ ;; Switch to the first workspace
+ (exwm-workspace-switch 0 t)
+ ;; Prevent frame parameters introduced by this module from being
+ ;; saved/restored.
+ (dolist (i '(exwm-active exwm-outer-id exwm-id exwm-container exwm-geometry
+ exwm-selected-window exwm-urgency fullscreen))
+ (unless (assq i frameset-filter-alist)
+ (push (cons i :never) frameset-filter-alist))))
+
+(defun exwm-workspace--exit ()
+ "Exit the workspace module."
+ (exwm--log)
+ (when (exwm-workspace--minibuffer-own-frame-p)
+ (exwm-workspace--exit-minibuffer-frame))
+ (advice-remove 'x-create-frame #'exwm-workspace--x-create-frame)
+ (advice-remove 'handle-focus-in #'exwm-workspace--handle-focus-in)
+ (advice-remove 'handle-focus-out #'exwm-workspace--handle-focus-out)
+ (remove-hook 'after-make-frame-functions
+ #'exwm-workspace--on-after-make-frame)
+ (remove-hook 'delete-frame-functions
+ #'exwm-workspace--on-delete-frame)
+ (when (exwm-workspace--minibuffer-own-frame-p)
+ (remove-hook 'exwm-input--event-hook
+ #'exwm-workspace--on-echo-area-clear))
+ ;; Hide & reparent out all frames (save-set can't be used here since
+ ;; X windows will be re-mapped).
+ (when (slot-value exwm--connection 'connected)
+ (dolist (i exwm-workspace--list)
+ (when (frame-live-p i) ; might be already dead
+ (exwm-workspace--remove-frame-as-workspace i 'quit)
+ (modify-frame-parameters i '((exwm-selected-window . nil)
+ (exwm-urgency . nil)
+ (exwm-outer-id . nil)
+ (exwm-id . nil)
+ (exwm-container . nil)
+ ;; (internal-border-width . nil) ; integerp
+ (fullscreen . nil)
+ (buffer-predicate . nil))))))
+ ;; Don't let dead frames linger.
+ (setq exwm-workspace--current nil)
+ (setq exwm-workspace-current-index 0)
+ (setq exwm-workspace--list nil))
+
+(defun exwm-workspace--post-init ()
+ "The second stage in the initialization of the workspace module."
+ (exwm--log)
+ ;; Wait until all workspace frames are resized.
+ (with-timeout (1)
+ (while (< exwm-workspace--fullscreen-frame-count (exwm-workspace--count))
+ (accept-process-output nil 0.1)))
+ (setq exwm-workspace--fullscreen-frame-count nil))
+
+(provide 'exwm-workspace)
+;;; exwm-workspace.el ends here
diff --git a/elpa/exwm-0.33/exwm-workspace.elc b/elpa/exwm-0.33/exwm-workspace.elc
new file mode 100644
index 0000000..d0d2bda
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-workspace.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-xim.el b/elpa/exwm-0.33/exwm-xim.el
new file mode 100644
index 0000000..5f4b684
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-xim.el
@@ -0,0 +1,807 @@
+;;; exwm-xim.el --- XIM Module for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 module adds XIM support for EXWM and allows sending characters
+;; generated by any Emacs's builtin input method (info node `Input Methods')
+;; to X windows.
+
+;; This module is essentially an X input method server utilizing Emacs as
+;; its backend. It talks with X windows through the XIM protocol. The XIM
+;; protocol is quite flexible by itself, stating that an implementation can
+;; create network connections of various types as well as make use of an
+;; existing X connection for communication, and that an IM server may
+;; support multiple transport versions, various input styles and several
+;; event flow modals, etc. Here we only make choices that are most popular
+;; among other IM servers and more importantly, practical for Emacs to act
+;; as an IM server:
+;;
+;; + Packets are transported on top of an X connection like most IMEs.
+;; + Only transport version 0.0 (i.e. only-CM & Property-with-CM) is
+;; supported (same as "IM Server Developers Kit", adopted by most IMEs).
+;; + Only support static event flow, on-demand-synchronous method.
+;; + Only "root-window" input style is supported.
+
+;; To use this module, enable it as follows:
+;;
+;; (exwm-xim-mode 1)
+;;
+;; A keybinding for `toggle-input-method' is probably required to turn on &
+;; off an input method (default to `default-input-method'). It's bound to
+;; 'C-\' by default and can be made reachable when working with X windows:
+;;
+;; (push ?\C-\\ exwm-input-prefix-keys)
+;;
+;; It's also required (and error-prone) to setup environment variables to
+;; make applications actually use this input method. Typically the
+;; following lines should be inserted into '~/.xinitrc'.
+;;
+;; export XMODIFIERS=@im=exwm-xim
+;; export GTK_IM_MODULE=xim
+;; export QT_IM_MODULE=xim
+;; export CLUTTER_IM_MODULE=xim
+
+;; References:
+;; + XIM (http://www.x.org/releases/X11R7.6/doc/libX11/specs/XIM/xim.html)
+;; + IMdkit (http://xorg.freedesktop.org/archive/unsupported/lib/IMdkit/)
+;; + UIM (https://github.com/uim/uim)
+
+;;; Code:
+
+(require 'cl-lib)
+
+(require 'xcb-keysyms)
+(require 'xcb-xim)
+
+(require 'exwm-core)
+(require 'exwm-input)
+
+(defconst exwm-xim--locales
+ "@locale=\
+aa,af,ak,am,an,anp,ar,as,ast,ayc,az,be,bem,ber,bg,bhb,bho,bn,bo,br,brx,bs,byn,\
+ca,ce,cmn,crh,cs,csb,cv,cy,da,de,doi,dv,dz,el,en,es,et,eu,fa,ff,fi,fil,fo,fr,\
+fur,fy,ga,gd,gez,gl,gu,gv,ha,hak,he,hi,hne,hr,hsb,ht,hu,hy,ia,id,ig,ik,is,it,\
+iu,iw,ja,ka,kk,kl,km,kn,ko,kok,ks,ku,kw,ky,lb,lg,li,li,lij,lo,lt,lv,lzh,mag,\
+mai,mg,mhr,mi,mk,ml,mn,mni,mr,ms,mt,my,nan,nb,nds,ne,nhn,niu,nl,nn,nr,nso,oc,\
+om,or,os,pa,pa,pap,pl,ps,pt,quz,raj,ro,ru,rw,sa,sat,sc,sd,se,shs,si,sid,sk,sl,\
+so,sq,sr,ss,st,sv,sw,szl,ta,tcy,te,tg,th,the,ti,tig,tk,tl,tn,tr,ts,tt,ug,uk,\
+unm,ur,uz,ve,vi,wa,wae,wal,wo,xh,yi,yo,yue,zh,zu,\
+C,no"
+ "All supported locales (stolen from glibc).")
+
+(defconst exwm-xim--default-error
+ (make-instance 'xim:error
+ :im-id 0
+ :ic-id 0
+ :flag xim:error-flag:invalid-both
+ :error-code xim:error-code:bad-something
+ :length 0
+ :type 0
+ :detail nil)
+ "Default error returned to clients.")
+
+(defconst exwm-xim--default-im-attrs
+ (list (make-instance 'xim:XIMATTR
+ :id 0
+ :type xim:ATTRIBUTE-VALUE-TYPE:xim-styles
+ :length (length xlib:XNQueryInputStyle)
+ :attribute xlib:XNQueryInputStyle))
+ "Default IM attrs returned to clients.")
+
+(defconst exwm-xim--default-ic-attrs
+ (list (make-instance 'xim:XICATTR
+ :id 0
+ :type xim:ATTRIBUTE-VALUE-TYPE:long-data
+ :length (length xlib:XNInputStyle)
+ :attribute xlib:XNInputStyle)
+ (make-instance 'xim:XICATTR
+ :id 1
+ :type xim:ATTRIBUTE-VALUE-TYPE:window
+ :length (length xlib:XNClientWindow)
+ :attribute xlib:XNClientWindow)
+ ;; Required by e.g. xterm.
+ (make-instance 'xim:XICATTR
+ :id 2
+ :type xim:ATTRIBUTE-VALUE-TYPE:window
+ :length (length xlib:XNFocusWindow)
+ :attribute xlib:XNFocusWindow))
+ "Default IC attrs returned to clients.")
+
+(defconst exwm-xim--default-styles
+ (make-instance 'xim:XIMStyles
+ :number nil
+ :styles (list (logior xlib:XIMPreeditNothing
+ xlib:XIMStatusNothing)))
+ "Default styles: root-window, i.e. no preediting or status display support.")
+
+(defconst exwm-xim--default-attributes
+ (list (make-instance 'xim:XIMATTRIBUTE
+ :id 0
+ :length nil
+ :value exwm-xim--default-styles))
+ "Default IM/IC attributes returned to clients.")
+
+(defvar exwm-xim--conn nil
+ "The X connection for initiating other XIM connections.")
+(defvar exwm-xim--event-xwin nil
+ "X window for initiating new XIM connections.")
+(defvar exwm-xim--server-client-plist '(nil nil)
+ "Plist mapping server window to [X connection, client window, byte-order].")
+(defvar exwm-xim--client-server-plist '(nil nil)
+ "Plist mapping client window to server window.")
+(defvar exwm-xim--property-index 0 "For generating a unique property name.")
+(defvar exwm-xim--im-id 0 "Last IM ID.")
+(defvar exwm-xim--ic-id 0 "Last IC ID.")
+
+;; X11 atoms.
+(defvar exwm-xim--@server nil)
+(defvar exwm-xim--LOCALES nil)
+(defvar exwm-xim--TRANSPORT nil)
+(defvar exwm-xim--XIM_SERVERS nil)
+(defvar exwm-xim--_XIM_PROTOCOL nil)
+(defvar exwm-xim--_XIM_XCONNECT nil)
+
+(defvar exwm-xim-buffer-p nil
+ "Whether current buffer is used by exwm-xim.")
+(make-variable-buffer-local 'exwm-xim-buffer-p)
+
+(defun exwm-xim--on-SelectionRequest (data _synthetic)
+ "Handle SelectionRequest events on IMS window.
+DATA contains unmarshalled SelectionRequest event data.
+
+Such events would be received when clients query for LOCALES or TRANSPORT."
+ (exwm--log)
+ (let ((evt (make-instance 'xcb:SelectionRequest))
+ value fake-event)
+ (xcb:unmarshal evt data)
+ (with-slots (time requestor selection target property) evt
+ (setq value (cond ((= target exwm-xim--LOCALES)
+ ;; Return supported locales.
+ exwm-xim--locales)
+ ((= target exwm-xim--TRANSPORT)
+ ;; Use XIM over an X connection.
+ "@transport=X/")))
+ (when value
+ ;; Change the property.
+ (xcb:+request exwm-xim--conn
+ (make-instance 'xcb:ChangeProperty
+ :mode xcb:PropMode:Replace
+ :window requestor
+ :property property
+ :type target
+ :format 8
+ :data-len (length value)
+ :data value))
+ ;; Send a SelectionNotify event.
+ (setq fake-event (make-instance 'xcb:SelectionNotify
+ :time time
+ :requestor requestor
+ :selection selection
+ :target target
+ :property property))
+ (xcb:+request exwm-xim--conn
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination requestor
+ :event-mask xcb:EventMask:NoEvent
+ :event (xcb:marshal fake-event exwm-xim--conn)))
+ (xcb:flush exwm-xim--conn)))))
+
+(cl-defun exwm-xim--on-ClientMessage-0 (data _synthetic)
+ "Handle ClientMessage event on IMS window (new connection).
+
+Such events would be received when clients request for _XIM_XCONNECT.
+A new X connection and server window would be created to communicate with
+this client."
+ (exwm--log)
+ (let ((evt (make-instance 'xcb:ClientMessage))
+ conn client-xwin server-xwin)
+ (xcb:unmarshal evt data)
+ (with-slots (window type data) evt
+ (unless (= type exwm-xim--_XIM_XCONNECT)
+ ;; Only handle _XIM_XCONNECT.
+ (exwm--log "Ignore ClientMessage %s" type)
+ (cl-return-from exwm-xim--on-ClientMessage-0))
+ (setq client-xwin (elt (slot-value data 'data32) 0)
+ ;; Create a new X connection and a new server window.
+ conn (xcb:connect)
+ server-xwin (xcb:generate-id conn))
+ (set-process-query-on-exit-flag (slot-value conn 'process) nil)
+ ;; Store this client.
+ (plist-put exwm-xim--server-client-plist server-xwin
+ `[,conn ,client-xwin nil])
+ (plist-put exwm-xim--client-server-plist client-xwin server-xwin)
+ ;; Select DestroyNotify events on this client window.
+ (xcb:+request exwm-xim--conn
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window client-xwin
+ :value-mask xcb:CW:EventMask
+ :event-mask xcb:EventMask:StructureNotify))
+ (xcb:flush exwm-xim--conn)
+ ;; Handle ClientMessage events from this new connection.
+ (xcb:+event conn 'xcb:ClientMessage #'exwm-xim--on-ClientMessage)
+ ;; Create a communication window.
+ (xcb:+request conn
+ (make-instance 'xcb:CreateWindow
+ :depth 0
+ :wid server-xwin
+ :parent exwm--root
+ :x 0
+ :y 0
+ :width 1
+ :height 1
+ :border-width 0
+ :class xcb:WindowClass:InputOutput
+ :visual 0
+ :value-mask xcb:CW:OverrideRedirect
+ :override-redirect 1))
+ (xcb:flush conn)
+ ;; Send connection establishment ClientMessage.
+ (setf window client-xwin
+ (slot-value data 'data32) `(,server-xwin 0 0 0 0))
+ (slot-makeunbound data 'data8)
+ (slot-makeunbound data 'data16)
+ (xcb:+request exwm-xim--conn
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination client-xwin
+ :event-mask xcb:EventMask:NoEvent
+ :event (xcb:marshal evt exwm-xim--conn)))
+ (xcb:flush exwm-xim--conn))))
+
+(cl-defun exwm-xim--on-ClientMessage (data _synthetic)
+ "Handle ClientMessage event DATA on IMS communication window (request).
+
+Such events would be received when clients request for _XIM_PROTOCOL.
+The actual XIM request is in client message data or a property."
+ (exwm--log)
+ (let ((evt (make-instance 'xcb:ClientMessage))
+ conn client-xwin server-xwin)
+ (xcb:unmarshal evt data)
+ (with-slots (format window type data) evt
+ (unless (= type exwm-xim--_XIM_PROTOCOL)
+ (exwm--log "Ignore ClientMessage %s" type)
+ (cl-return-from exwm-xim--on-ClientMessage))
+ (setq server-xwin window
+ conn (plist-get exwm-xim--server-client-plist server-xwin)
+ client-xwin (elt conn 1)
+ conn (elt conn 0))
+ (cond ((= format 8)
+ ;; Data.
+ (exwm-xim--on-request (vconcat (slot-value data 'data8))
+ conn client-xwin server-xwin))
+ ((= format 32)
+ ;; Atom.
+ (with-slots (data32) data
+ (with-slots (value)
+ (xcb:+request-unchecked+reply conn
+ (make-instance 'xcb:GetProperty
+ :delete 1
+ :window server-xwin
+ :property (elt data32 1)
+ :type xcb:GetPropertyType:Any
+ :long-offset 0
+ :long-length (elt data32 0)))
+ (when (> (length value) 0)
+ (exwm-xim--on-request value conn client-xwin
+ server-xwin)))))))))
+
+(defun exwm-xim--on-request (data conn client-xwin server-xwin)
+ "Handle an XIM reuqest."
+ (exwm--log)
+ (let ((opcode (elt data 0))
+ ;; Let-bind `xim:lsb' to make pack/unpack functions work correctly.
+ (xim:lsb (elt (plist-get exwm-xim--server-client-plist server-xwin) 2))
+ req replies)
+ (cond ((= opcode xim:opcode:error)
+ (exwm--log "ERROR: %s" data))
+ ((= opcode xim:opcode:connect)
+ (exwm--log "CONNECT")
+ (setq xim:lsb (= (elt data 4) xim:connect-byte-order:lsb-first))
+ ;; Store byte-order.
+ (setf (elt (plist-get exwm-xim--server-client-plist server-xwin) 2)
+ xim:lsb)
+ (setq req (make-instance 'xim:connect))
+ (xcb:unmarshal req data)
+ (if (and (= (slot-value req 'major-version) 1)
+ (= (slot-value req 'minor-version) 0)
+ ;; Do not support authentication.
+ (= (slot-value req 'number) 0))
+ ;; Accept the connection.
+ (push (make-instance 'xim:connect-reply) replies)
+ ;; Deny it.
+ (push exwm-xim--default-error replies)))
+ ((memq opcode (list xim:opcode:auth-required
+ xim:opcode:auth-reply
+ xim:opcode:auth-next
+ xim:opcode:auth-ng))
+ (exwm--log "AUTH: %d" opcode)
+ ;; Deny any attempt to make authentication.
+ (push exwm-xim--default-error replies))
+ ((= opcode xim:opcode:disconnect)
+ (exwm--log "DISCONNECT")
+ ;; Gracefully disconnect from the client.
+ (exwm-xim--make-request (make-instance 'xim:disconnect-reply)
+ conn client-xwin)
+ ;; Destroy the communication window & connection.
+ (xcb:+request conn
+ (make-instance 'xcb:DestroyWindow
+ :window server-xwin))
+ (xcb:disconnect conn)
+ ;; Clean up cache.
+ (cl-remf exwm-xim--server-client-plist server-xwin)
+ (cl-remf exwm-xim--client-server-plist client-xwin))
+ ((= opcode xim:opcode:open)
+ (exwm--log "OPEN")
+ ;; Note: We make no check here.
+ (setq exwm-xim--im-id (if (< exwm-xim--im-id #xffff)
+ (1+ exwm-xim--im-id)
+ 1))
+ (setq replies
+ (list
+ (make-instance 'xim:open-reply
+ :im-id exwm-xim--im-id
+ :im-attrs-length nil
+ :im-attrs exwm-xim--default-im-attrs
+ :ic-attrs-length nil
+ :ic-attrs exwm-xim--default-ic-attrs)
+ (make-instance 'xim:set-event-mask
+ :im-id exwm-xim--im-id
+ :ic-id 0
+ ;; Static event flow.
+ :forward-event-mask xcb:EventMask:KeyPress
+ ;; on-demand-synchronous method.
+ :synchronous-event-mask
+ xcb:EventMask:NoEvent))))
+ ((= opcode xim:opcode:close)
+ (exwm--log "CLOSE")
+ (setq req (make-instance 'xim:close))
+ (xcb:unmarshal req data)
+ (push (make-instance 'xim:close-reply
+ :im-id (slot-value req 'im-id))
+ replies))
+ ((= opcode xim:opcode:trigger-notify)
+ (exwm--log "TRIGGER-NOTIFY")
+ ;; Only static event flow modal is supported.
+ (push exwm-xim--default-error replies))
+ ((= opcode xim:opcode:encoding-negotiation)
+ (exwm--log "ENCODING-NEGOTIATION")
+ (setq req (make-instance 'xim:encoding-negotiation))
+ (xcb:unmarshal req data)
+ (let ((index (cl-position "COMPOUND_TEXT"
+ (mapcar (lambda (i) (slot-value i 'name))
+ (slot-value req 'names))
+ :test #'equal)))
+ (unless index
+ ;; Fallback to portable character encoding (a subset of ASCII).
+ (setq index -1))
+ (push (make-instance 'xim:encoding-negotiation-reply
+ :im-id (slot-value req 'im-id)
+ :category
+ xim:encoding-negotiation-reply-category:name
+ :index index)
+ replies)))
+ ((= opcode xim:opcode:query-extension)
+ (exwm--log "QUERY-EXTENSION")
+ (setq req (make-instance 'xim:query-extension))
+ (xcb:unmarshal req data)
+ (push (make-instance 'xim:query-extension-reply
+ :im-id (slot-value req 'im-id)
+ ;; No extension support.
+ :length 0
+ :extensions nil)
+ replies))
+ ((= opcode xim:opcode:set-im-values)
+ (exwm--log "SET-IM-VALUES")
+ ;; There's only one possible input method attribute.
+ (setq req (make-instance 'xim:set-im-values))
+ (xcb:unmarshal req data)
+ (push (make-instance 'xim:set-im-values-reply
+ :im-id (slot-value req 'im-id))
+ replies))
+ ((= opcode xim:opcode:get-im-values)
+ (exwm--log "GET-IM-VALUES")
+ (setq req (make-instance 'xim:get-im-values))
+ (let (im-attributes-id)
+ (xcb:unmarshal req data)
+ (setq im-attributes-id (slot-value req 'im-attributes-id))
+ (if (cl-notevery (lambda (i) (= i 0)) im-attributes-id)
+ ;; Only support one IM attributes.
+ (push (make-instance 'xim:error
+ :im-id (slot-value req 'im-id)
+ :ic-id 0
+ :flag xim:error-flag:invalid-ic-id
+ :error-code xim:error-code:bad-something
+ :length 0
+ :type 0
+ :detail nil)
+ replies)
+ (push
+ (make-instance 'xim:get-im-values-reply
+ :im-id (slot-value req 'im-id)
+ :length nil
+ :im-attributes exwm-xim--default-attributes)
+ replies))))
+ ((= opcode xim:opcode:create-ic)
+ (exwm--log "CREATE-IC")
+ (setq req (make-instance 'xim:create-ic))
+ (xcb:unmarshal req data)
+ ;; Note: The ic-attributes slot is ignored.
+ (setq exwm-xim--ic-id (if (< exwm-xim--ic-id #xffff)
+ (1+ exwm-xim--ic-id)
+ 1))
+ (push (make-instance 'xim:create-ic-reply
+ :im-id (slot-value req 'im-id)
+ :ic-id exwm-xim--ic-id)
+ replies))
+ ((= opcode xim:opcode:destroy-ic)
+ (exwm--log "DESTROY-IC")
+ (setq req (make-instance 'xim:destroy-ic))
+ (xcb:unmarshal req data)
+ (push (make-instance 'xim:destroy-ic-reply
+ :im-id (slot-value req 'im-id)
+ :ic-id (slot-value req 'ic-id))
+ replies))
+ ((= opcode xim:opcode:set-ic-values)
+ (exwm--log "SET-IC-VALUES")
+ (setq req (make-instance 'xim:set-ic-values))
+ (xcb:unmarshal req data)
+ ;; We don't distinguish between input contexts.
+ (push (make-instance 'xim:set-ic-values-reply
+ :im-id (slot-value req 'im-id)
+ :ic-id (slot-value req 'ic-id))
+ replies))
+ ((= opcode xim:opcode:get-ic-values)
+ (exwm--log "GET-IC-VALUES")
+ (setq req (make-instance 'xim:get-ic-values))
+ (xcb:unmarshal req data)
+ (push (make-instance 'xim:get-ic-values-reply
+ :im-id (slot-value req 'im-id)
+ :ic-id (slot-value req 'ic-id)
+ :length nil
+ :ic-attributes exwm-xim--default-attributes)
+ replies))
+ ((= opcode xim:opcode:set-ic-focus)
+ (exwm--log "SET-IC-FOCUS")
+ ;; All input contexts are the same.
+ )
+ ((= opcode xim:opcode:unset-ic-focus)
+ (exwm--log "UNSET-IC-FOCUS")
+ ;; All input contexts are the same.
+ )
+ ((= opcode xim:opcode:forward-event)
+ (exwm--log "FORWARD-EVENT")
+ (setq req (make-instance 'xim:forward-event))
+ (xcb:unmarshal req data)
+ (exwm-xim--handle-forward-event-request req xim:lsb conn
+ client-xwin))
+ ((= opcode xim:opcode:sync)
+ (exwm--log "SYNC")
+ (setq req (make-instance 'xim:sync))
+ (xcb:unmarshal req data)
+ (push (make-instance 'xim:sync-reply
+ :im-id (slot-value req 'im-id)
+ :ic-id (slot-value req 'ic-id))
+ replies))
+ ((= opcode xim:opcode:sync-reply)
+ (exwm--log "SYNC-REPLY"))
+ ((= opcode xim:opcode:reset-ic)
+ (exwm--log "RESET-IC")
+ ;; No context-specific data saved.
+ (setq req (make-instance 'xim:reset-ic))
+ (xcb:unmarshal req data)
+ (push (make-instance 'xim:reset-ic-reply
+ :im-id (slot-value req 'im-id)
+ :ic-id (slot-value req 'ic-id)
+ :length 0
+ :string "")
+ replies))
+ ((memq opcode (list xim:opcode:str-conversion-reply
+ xim:opcode:preedit-start-reply
+ xim:opcode:preedit-caret-reply))
+ (exwm--log "PREEDIT: %d" opcode)
+ ;; No preedit support.
+ (push exwm-xim--default-error replies))
+ (t
+ (exwm--log "Bad protocol")
+ (push exwm-xim--default-error replies)))
+ ;; Actually send the replies.
+ (when replies
+ (mapc (lambda (reply)
+ (exwm-xim--make-request reply conn client-xwin))
+ replies)
+ (xcb:flush conn))))
+
+(defun exwm-xim--handle-forward-event-request (req lsb conn client-xwin)
+ (let ((im-func (with-current-buffer (window-buffer)
+ input-method-function))
+ key-event keysym keysyms event result)
+ ;; Note: The flag slot is ignored.
+ ;; Do conversion in client's byte-order.
+ (let ((xcb:lsb lsb))
+ (setq key-event (make-instance 'xcb:KeyPress))
+ (xcb:unmarshal key-event (slot-value req 'event)))
+ (with-slots (detail state) key-event
+ (setq keysym (xcb:keysyms:keycode->keysym exwm-xim--conn detail
+ state))
+ (when (/= (car keysym) 0)
+ (setq event (xcb:keysyms:keysym->event
+ exwm-xim--conn
+ (car keysym)
+ (logand state (lognot (cdr keysym)))))))
+ (while (or (slot-value req 'event) unread-command-events)
+ (unless (slot-value req 'event)
+ (setq event (pop unread-command-events))
+ ;; Handle events in (t . EVENT) format.
+ (when (and (consp event)
+ (eq (car event) t))
+ (setq event (cdr event))))
+ (if (or (not im-func)
+ ;; `list' is the default method.
+ (eq im-func #'list)
+ (not event)
+ ;; Select only printable keys.
+ (not (integerp event)) (> #x20 event) (< #x7e event))
+ ;; Either there is no active input method, or invalid key
+ ;; is detected.
+ (with-slots ((raw-event event)
+ im-id ic-id serial-number)
+ req
+ (if raw-event
+ (setq event raw-event)
+ (setq keysyms (xcb:keysyms:event->keysyms exwm-xim--conn event))
+ (with-slots (detail state) key-event
+ (setf detail (xcb:keysyms:keysym->keycode exwm-xim--conn
+ (caar keysyms))
+ state (cdar keysyms)))
+ (setq event (let ((xcb:lsb lsb))
+ (xcb:marshal key-event conn))))
+ (when event
+ (exwm-xim--make-request
+ (make-instance 'xim:forward-event
+ :im-id im-id
+ :ic-id ic-id
+ :flag xim:commit-flag:synchronous
+ :serial-number serial-number
+ :event event)
+ conn client-xwin)))
+ (when (eq exwm--selected-input-mode 'char-mode)
+ ;; Grab keyboard temporarily for char-mode.
+ (exwm-input--grab-keyboard))
+ (unwind-protect
+ (with-temp-buffer
+ ;; This variable is used to test whether exwm-xim is enabled.
+ ;; Used by e.g. pyim-probe.
+ (setq-local exwm-xim-buffer-p t)
+ ;; Always show key strokes.
+ (let ((input-method-use-echo-area t)
+ (exwm-input-line-mode-passthrough t))
+ (setq result (funcall im-func event))
+ ;; Clear echo area for the input method.
+ (message nil)
+ ;; This also works for portable character encoding.
+ (setq result
+ (encode-coding-string (concat result)
+ 'compound-text-with-extensions))
+ (exwm-xim--make-request
+ (make-instance 'xim:commit-x-lookup-chars
+ :im-id (slot-value req 'im-id)
+ :ic-id (slot-value req 'ic-id)
+ :flag (logior xim:commit-flag:synchronous
+ xim:commit-flag:x-lookup-chars)
+ :length (length result)
+ :string result)
+ conn client-xwin)))
+ (when (eq exwm--selected-input-mode 'char-mode)
+ (exwm-input--release-keyboard))))
+ (xcb:flush conn)
+ (setf event nil
+ (slot-value req 'event) nil))))
+
+(defun exwm-xim--make-request (req conn client-xwin)
+ "Make an XIM request REQ via connection CONN.
+
+CLIENT-XWIN would receive a ClientMessage event either telling the client
+the request data or where to fetch the data."
+ (exwm--log)
+ (let ((data (xcb:marshal req))
+ property format client-message-data client-message)
+ (if (<= (length data) 20)
+ ;; Send short requests directly with client messages.
+ (setq format 8
+ ;; Pad to 20 bytes.
+ data (append data (make-list (- 20 (length data)) 0))
+ client-message-data (make-instance 'xcb:ClientMessageData
+ :data8 data))
+ ;; Send long requests with properties.
+ (setq property (exwm--intern-atom (format "_EXWM_XIM_%x"
+ exwm-xim--property-index)))
+ (cl-incf exwm-xim--property-index)
+ (xcb:+request conn
+ (make-instance 'xcb:ChangeProperty
+ :mode xcb:PropMode:Append
+ :window client-xwin
+ :property property
+ :type xcb:Atom:STRING
+ :format 8
+ :data-len (length data)
+ :data data))
+ ;; Also send a client message to notify the client about this property.
+ (setq format 32
+ client-message-data (make-instance 'xcb:ClientMessageData
+ :data32 `(,(length data)
+ ,property
+ ;; Pad to 20 bytes.
+ 0 0 0))))
+ ;; Send the client message.
+ (setq client-message (make-instance 'xcb:ClientMessage
+ :format format
+ :window client-xwin
+ :type exwm-xim--_XIM_PROTOCOL
+ :data client-message-data))
+ (xcb:+request conn
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination client-xwin
+ :event-mask xcb:EventMask:NoEvent
+ :event (xcb:marshal client-message conn)))))
+
+(defun exwm-xim--on-DestroyNotify (data synthetic)
+ "Do cleanups on receiving DestroyNotify event.
+
+Such event would be received when the client window is destroyed."
+ (exwm--log)
+ (unless synthetic
+ (let ((evt (make-instance 'xcb:DestroyNotify))
+ conn client-xwin server-xwin)
+ (xcb:unmarshal evt data)
+ (setq client-xwin (slot-value evt 'window)
+ server-xwin (plist-get exwm-xim--client-server-plist client-xwin))
+ (when server-xwin
+ (setq conn (aref (plist-get exwm-xim--server-client-plist server-xwin)
+ 0))
+ (cl-remf exwm-xim--server-client-plist server-xwin)
+ (cl-remf exwm-xim--client-server-plist client-xwin)
+ ;; Destroy the communication window & connection.
+ (xcb:+request conn
+ (make-instance 'xcb:DestroyWindow
+ :window server-xwin))
+ (xcb:disconnect conn)))))
+
+(cl-defun exwm-xim--init ()
+ "Initialize the XIM module."
+ (exwm--log)
+ (when exwm-xim--conn
+ (cl-return-from exwm-xim--init))
+ ;; Initialize atoms.
+ (setq exwm-xim--@server (exwm--intern-atom "@server=exwm-xim")
+ exwm-xim--LOCALES (exwm--intern-atom "LOCALES")
+ exwm-xim--TRANSPORT (exwm--intern-atom "TRANSPORT")
+ exwm-xim--XIM_SERVERS (exwm--intern-atom "XIM_SERVERS")
+ exwm-xim--_XIM_PROTOCOL (exwm--intern-atom "_XIM_PROTOCOL")
+ exwm-xim--_XIM_XCONNECT (exwm--intern-atom "_XIM_XCONNECT"))
+ ;; Create a new connection and event window.
+ (setq exwm-xim--conn (xcb:connect)
+ exwm-xim--event-xwin (xcb:generate-id exwm-xim--conn))
+ (set-process-query-on-exit-flag (slot-value exwm-xim--conn 'process) nil)
+ ;; Initialize xcb:keysyms module.
+ (xcb:keysyms:init exwm-xim--conn)
+ ;; Listen to SelectionRequest event for connection establishment.
+ (xcb:+event exwm-xim--conn 'xcb:SelectionRequest
+ #'exwm-xim--on-SelectionRequest)
+ ;; Listen to ClientMessage event on IMS window for new XIM connection.
+ (xcb:+event exwm-xim--conn 'xcb:ClientMessage #'exwm-xim--on-ClientMessage-0)
+ ;; Listen to DestroyNotify event to do cleanups.
+ (xcb:+event exwm-xim--conn 'xcb:DestroyNotify #'exwm-xim--on-DestroyNotify)
+ ;; Create the event window.
+ (xcb:+request exwm-xim--conn
+ (make-instance 'xcb:CreateWindow
+ :depth 0
+ :wid exwm-xim--event-xwin
+ :parent exwm--root
+ :x 0
+ :y 0
+ :width 1
+ :height 1
+ :border-width 0
+ :class xcb:WindowClass:InputOutput
+ :visual 0
+ :value-mask xcb:CW:OverrideRedirect
+ :override-redirect 1))
+ ;; Set the selection owner.
+ (xcb:+request exwm-xim--conn
+ (make-instance 'xcb:SetSelectionOwner
+ :owner exwm-xim--event-xwin
+ :selection exwm-xim--@server
+ :time xcb:Time:CurrentTime))
+ ;; Set XIM_SERVERS property on the root window.
+ (xcb:+request exwm-xim--conn
+ (make-instance 'xcb:ChangeProperty
+ :mode xcb:PropMode:Prepend
+ :window exwm--root
+ :property exwm-xim--XIM_SERVERS
+ :type xcb:Atom:ATOM
+ :format 32
+ :data-len 1
+ :data (funcall (if xcb:lsb
+ #'xcb:-pack-u4-lsb
+ #'xcb:-pack-u4)
+ exwm-xim--@server)))
+ (xcb:flush exwm-xim--conn))
+
+(cl-defun exwm-xim--exit ()
+ "Exit the XIM module."
+ (exwm--log)
+ ;; Close IMS communication connections.
+ (mapc (lambda (i)
+ (when (vectorp i)
+ (when (slot-value (elt i 0) 'connected)
+ (xcb:disconnect (elt i 0)))))
+ exwm-xim--server-client-plist)
+ ;; Close the IMS connection.
+ (unless (and exwm-xim--conn
+ (slot-value exwm-xim--conn 'connected))
+ (cl-return-from exwm-xim--exit))
+ ;; Remove exwm-xim from XIM_SERVERS.
+ (let ((reply (xcb:+request-unchecked+reply exwm-xim--conn
+ (make-instance 'xcb:GetProperty
+ :delete 1
+ :window exwm--root
+ :property exwm-xim--XIM_SERVERS
+ :type xcb:Atom:ATOM
+ :long-offset 0
+ :long-length 1000)))
+ unpacked-reply pack unpack)
+ (unless reply
+ (cl-return-from exwm-xim--exit))
+ (setq reply (slot-value reply 'value))
+ (unless (> (length reply) 4)
+ (cl-return-from exwm-xim--exit))
+ (setq reply (vconcat reply)
+ pack (if xcb:lsb #'xcb:-pack-u4-lsb #'xcb:-pack-u4)
+ unpack (if xcb:lsb #'xcb:-unpack-u4-lsb #'xcb:-unpack-u4))
+ (dotimes (i (/ (length reply) 4))
+ (push (funcall unpack reply (* i 4)) unpacked-reply))
+ (setq unpacked-reply (delq exwm-xim--@server unpacked-reply)
+ reply (mapcar pack unpacked-reply))
+ (xcb:+request exwm-xim--conn
+ (make-instance 'xcb:ChangeProperty
+ :mode xcb:PropMode:Replace
+ :window exwm--root
+ :property exwm-xim--XIM_SERVERS
+ :type xcb:Atom:ATOM
+ :format 32
+ :data-len (length reply)
+ :data reply))
+ (xcb:flush exwm-xim--conn))
+ (xcb:disconnect exwm-xim--conn)
+ (setq exwm-xim--conn nil))
+
+;;;###autoload
+(define-minor-mode exwm-xim-mode
+ "Toggle EXWM XIM support."
+ :global t
+ :group 'exwm
+ (exwm--global-minor-mode-body xim))
+
+(provide 'exwm-xim)
+;;; exwm-xim.el ends here
diff --git a/elpa/exwm-0.33/exwm-xim.elc b/elpa/exwm-0.33/exwm-xim.elc
new file mode 100644
index 0000000..bc87569
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-xim.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm-xsettings.el b/elpa/exwm-0.33/exwm-xsettings.el
new file mode 100644
index 0000000..44d8149
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-xsettings.el
@@ -0,0 +1,323 @@
+;;; exwm-xsettings.el --- XSETTINGS Module for EXWM -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022-2025 Free Software Foundation, Inc.
+
+;; Author: Steven Allen <steven@stebalien.com>
+
+;; 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:
+
+;; Implements the XSETTINGS protocol, allowing Emacs to manage the system theme,
+;; fonts, icons, etc.
+;;
+;; This package can be configured as follows:
+;;
+;; (setq exwm-xsettings-theme '("Adwaita" . "Adwaita-dark") ;; light/dark
+;; exwm-xsettings `(("Xft/HintStyle" . "hintslight")
+;; ("Xft/RGBA" . "rgb")
+;; ("Xft/lcdfilter" . "lcddefault")
+;; ("Xft/Antialias" . 1)
+;; ;; DPI is in 1024ths of an inch, so this is a DPI of
+;; ;; 144, equivalent to ;; a scaling factor of 1.5
+;; ;; (144 = 1.5 * 96).
+;; ("Xft/DPI" . ,(* 144 1024))
+;; ("Xft/Hinting" . 1)))
+;; (exwm-xsettings-mode 1)
+;;
+;; To modify these settings at runtime, customize them with
+;; `custom-set-variables' or `setopt' (Emacs 29+). E.g., the following will
+;; immediately change the icon theme to "Papirus" at runtime, even in running
+;; applications:
+;;
+;; (setopt exwm-xsettings-icon-theme "Papirus")
+
+;;; Code:
+
+(require 'xcb-ewmh)
+(require 'xcb-xsettings)
+(require 'exwm-core)
+
+(defgroup exwm-xsettings nil
+ "XSETTINGS."
+ :group 'exwm)
+
+(defvar exwm-xsettings--connection nil)
+(defvar exwm-xsettings--XSETTINGS_SETTINGS-atom nil)
+(defvar exwm-xsettings--XSETTINGS_S0-atom nil)
+(defvar exwm-xsettings--selection-owner-window nil)
+(defvar exwm-xsettings--serial 0)
+
+;;;###autoload
+(define-minor-mode exwm-xsettings-mode
+ "Toggle EXWM xsettings support."
+ :global t
+ :group 'exwm-xsettings
+ (exwm--global-minor-mode-body xsettings))
+
+(defun exwm-xsettings--rgba-match (_widget value)
+ "Return t if VALUE is a valid RGBA color."
+ (and (numberp value) (<= 0 value 1)))
+
+(defun exwm-xsettings--custom-set (symbol value)
+ "Setter used by `exwm-xsettings' customization options.
+
+SYMBOL is the setting being updated and VALUE is the new value."
+ (set-default-toplevel-value symbol value)
+ (when exwm-xsettings-mode (exwm-xsettings--update-settings)))
+
+(defcustom exwm-xsettings nil
+ "Alist of custom XSETTINGS.
+These settings take precedence over `exwm-xsettings-theme' and
+`exwm-xsettings-icon-theme'."
+ :type '(alist :key-type (string :tag "Name")
+ :value-type (choice :tag "Value"
+ (string :tag "String")
+ (integer :tag "Integer")
+ (list :tag "Color"
+ (number :tag "Red"
+ :type-error
+ "This field should contain a number between 0 and 1."
+ :match exwm-xsettings--rgba-match)
+ (number :tag "Green"
+ :type-error
+ "This field should contain a number between 0 and 1."
+ :match exwm-xsettings--rgba-match)
+ (number :tag "Blue"
+ :type-error
+ "This field should contain a number between 0 and 1."
+ :match exwm-xsettings--rgba-match)
+ (number :tag "Alpha"
+ :type-error
+ "This field should contain a number between 0 and 1."
+ :match exwm-xsettings--rgba-match
+ :value 1.0))))
+ :initialize #'custom-initialize-default
+ :set #'exwm-xsettings--custom-set)
+
+(defcustom exwm-xsettings-theme nil
+ "The system-wide theme."
+ :type '(choice (string :tag "Theme")
+ (cons (string :tag "Light Theme")
+ (string :tag "Dark Theme")))
+ :initialize #'custom-initialize-default
+ :set #'exwm-xsettings--custom-set)
+
+(defcustom exwm-xsettings-icon-theme nil
+ "The system-wide icon theme."
+ :type '(choice (string :tag "Icon Theme")
+ (cons (string :tag "Light Icon Theme")
+ (string :tag "Dark Icon Theme")))
+ :initialize #'custom-initialize-default
+ :set #'exwm-xsettings--custom-set)
+
+(defun exwm-xsettings--pick-theme (theme)
+ "Pick a light or dark theme from the given THEME.
+If THEME is a string, it's returned directly.
+If THEME is a cons of (LIGHT . DARK), the appropriate theme is picked based on
+the default face's background color."
+ (pcase theme
+ ((cl-type string) theme)
+ (`(,(cl-type string) . ,(cl-type string))
+ (if (color-dark-p (color-name-to-rgb (face-background 'default)))
+ (cdr theme) (car theme)))
+ (_ (error "Expected theme to be a string or a pair of strings"))))
+
+(defun exwm-xsettings--get-settings ()
+ "Get the current settings.
+Combines `exwm-xsettings', `exwm-xsettings-theme' (if set), and
+`exwm-xsettings-icon-theme' (if set)."
+ (cl-remove-duplicates
+ (append
+ exwm-xsettings
+ (when exwm-xsettings-theme
+ (list (cons "Net/ThemeName" (exwm-xsettings--pick-theme exwm-xsettings-theme))))
+ (when exwm-xsettings-icon-theme
+ (list (cons "Net/IconThemeName" (exwm-xsettings--pick-theme exwm-xsettings-icon-theme)))))
+ :key 'car
+ :test 'string=))
+
+(defun exwm-xsettings--make-settings (settings serial)
+ "Construct a new settings object.
+SETTINGS is an alist of key/value pairs.
+SERIAL is a sequence number."
+ (make-instance 'xcb:xsettings:-Settings
+ :byte-order (if xcb:lsb 0 1)
+ :serial serial
+ :settings-len (length settings)
+ :settings
+ (mapcar
+ (lambda (prop)
+ (let* ((name (car prop))
+ (value (cdr prop))
+ (common (list :name name
+ :name-len (length name)
+ :last-change-serial serial)))
+ (pcase value
+ ((cl-type string)
+ (apply #'make-instance 'xcb:xsettings:-SETTING_STRING
+ :value-len (length value)
+ :value value
+ common))
+ ((cl-type integer)
+ (apply #'make-instance 'xcb:xsettings:-SETTING_INTEGER
+ :value value common))
+ ((and (cl-type list) (app length (or 3 4)))
+ ;; Convert from RGB(A) to 16bit integers.
+ (setq value (mapcar (lambda (x) (round (* x #xffff))) value))
+ (apply #'make-instance 'xcb:xsettings:-SETTING_COLOR
+ :red (pop value)
+ :green (pop value)
+ :blue (pop value)
+ :alpha (or (pop value) #xffff)))
+ (_ (error "Setting value must be a string, integer, or length 3-4 list")))))
+ settings)))
+
+(defun exwm-xsettings--update-settings ()
+ "Update the xsettings."
+ (when exwm-xsettings--connection
+ (setq exwm-xsettings--serial (1+ exwm-xsettings--serial))
+ (let* ((settings (exwm-xsettings--get-settings))
+ (bytes (xcb:marshal (exwm-xsettings--make-settings settings exwm-xsettings--serial))))
+ (xcb:+request exwm-xsettings--connection
+ (make-instance 'xcb:ChangeProperty
+ :mode xcb:PropMode:Replace
+ :window exwm-xsettings--selection-owner-window
+ :property exwm-xsettings--XSETTINGS_SETTINGS-atom
+ :type exwm-xsettings--XSETTINGS_SETTINGS-atom
+ :format 8
+ :data-len (length bytes)
+ :data bytes)))
+ (xcb:flush exwm-xsettings--connection)))
+
+(defun exwm-xsettings--on-theme-change (&rest _)
+ "Called when the Emacs theme is changed."
+ ;; We only bother updating the xsettings if changing the theme could effect
+ ;; the settings.
+ (when (or (consp exwm-xsettings-theme) (consp exwm-xsettings-icon-theme))
+ (exwm-xsettings--update-settings)))
+
+(defun exwm-xsettings--on-SelectionClear (_data _synthetic)
+ "Called when another xsettings daemon takes over."
+ (exwm--log "XSETTINGS manager has been replaced.")
+ (exwm-xsettings--exit))
+
+(cl-defun exwm-xsettings--init ()
+ "Initialize the XSETTINGS module."
+ (exwm--log)
+
+ ;; idempotent initialization
+ (when exwm-xsettings--connection
+ (cl-return-from exwm-xsettings--init))
+
+ ;; Connect
+ (setq exwm-xsettings--connection (xcb:connect))
+ (set-process-query-on-exit-flag (slot-value exwm-xsettings--connection
+ 'process)
+ nil)
+
+ ;; Intern the atoms.
+ (setq exwm-xsettings--XSETTINGS_SETTINGS-atom
+ (exwm--intern-atom "_XSETTINGS_SETTINGS" exwm-xsettings--connection)
+
+ exwm-xsettings--XSETTINGS_S0-atom
+ (exwm--intern-atom "_XSETTINGS_S0" exwm-xsettings--connection))
+
+ ;; Detect running XSETTINGS managers.
+ (with-slots (owner)
+ (xcb:+request-unchecked+reply exwm-xsettings--connection
+ (make-instance 'xcb:GetSelectionOwner
+ :selection exwm-xsettings--XSETTINGS_S0-atom))
+ (when (/= owner xcb:Window:None)
+ (xcb:disconnect exwm-xsettings--connection)
+ (setq exwm-xsettings--connection nil)
+ (warn "[EXWM] Other XSETTINGS manager detected")
+ (cl-return-from exwm-xsettings--init)))
+
+ (let ((id(xcb:generate-id exwm-xsettings--connection)))
+ (setq exwm-xsettings--selection-owner-window id)
+
+ ;; Create a settings window.
+ (xcb:+request exwm-xsettings--connection
+ (make-instance 'xcb:CreateWindow
+ :wid id
+ :parent exwm--root
+ :class xcb:WindowClass:InputOnly
+ :x 0
+ :y 0
+ :width 1
+ :height 1
+ :border-width 0
+ :depth 0
+ :visual 0
+ :value-mask xcb:CW:OverrideRedirect
+ :override-redirect 1))
+
+ ;; Set _NET_WM_NAME.
+ (xcb:+request exwm-xsettings--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window id
+ :data "EXWM: exwm-xsettings--selection-owner-window"))
+
+ ;; Apply the XSETTINGS properties.
+ (exwm-xsettings--update-settings)
+
+ ;; Take ownership and notify.
+ (xcb:+request exwm-xsettings--connection
+ (make-instance 'xcb:SetSelectionOwner
+ :owner id
+ :selection exwm-xsettings--XSETTINGS_S0-atom
+ :time xcb:Time:CurrentTime))
+ (xcb:+request exwm-xsettings--connection
+ (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination exwm--root
+ :event-mask xcb:EventMask:StructureNotify
+ :event (xcb:marshal
+ (make-instance 'xcb:icccm:-ManagerSelection
+ :window exwm--root
+ :time xcb:Time:CurrentTime
+ :selection exwm-xsettings--XSETTINGS_S0-atom
+ :owner id)
+ exwm-xsettings--connection)))
+
+ ;; Detect loss of XSETTINGS ownership.
+ (xcb:+event exwm-xsettings--connection 'xcb:SelectionClear
+ #'exwm-xsettings--on-SelectionClear)
+
+ (xcb:flush exwm-xsettings--connection))
+
+ ;; Update the xsettings if/when the theme changes.
+ (add-hook 'enable-theme-functions #'exwm-xsettings--on-theme-change)
+ (add-hook 'disable-theme-functions #'exwm-xsettings--on-theme-change))
+
+(defun exwm-xsettings--exit ()
+ "Exit the XSETTINGS module."
+ (exwm--log)
+
+ (when exwm-xsettings--connection
+ (remove-hook 'enable-theme-functions #'exwm-xsettings--on-theme-change)
+ (remove-hook 'disable-theme-functions #'exwm-xsettings--on-theme-change)
+
+ (xcb:disconnect exwm-xsettings--connection)
+
+ (setq exwm-xsettings--connection nil
+ exwm-xsettings--XSETTINGS_SETTINGS-atom nil
+ exwm-xsettings--XSETTINGS_S0-atom nil
+ exwm-xsettings--selection-owner-window nil)))
+
+(provide 'exwm-xsettings)
+;;; exwm-xsettings.el ends here
diff --git a/elpa/exwm-0.33/exwm-xsettings.elc b/elpa/exwm-0.33/exwm-xsettings.elc
new file mode 100644
index 0000000..5d542cd
--- /dev/null
+++ b/elpa/exwm-0.33/exwm-xsettings.elc
Binary files differ
diff --git a/elpa/exwm-0.33/exwm.el b/elpa/exwm-0.33/exwm.el
new file mode 100644
index 0000000..2af36e9
--- /dev/null
+++ b/elpa/exwm-0.33/exwm.el
@@ -0,0 +1,1143 @@
+;;; exwm.el --- Emacs X Window Manager -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2025 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+;; Maintainer: Adrián Medraño Calvo <adrian@medranocalvo.com>, Steven Allen <steven@stebalien.com>, Daniel Mendler <mail@daniel-mendler.de>
+;; Version: 0.33
+;; Package-Requires: ((emacs "27.1") (xelb "0.20") (compat "30"))
+;; Keywords: unix
+;; URL: https://github.com/emacs-exwm/exwm
+
+;; 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:
+
+;; Overview
+;; --------
+;; EXWM (Emacs X Window Manager) is a full-featured tiling X window manager
+;; for Emacs built on top of [XELB](https://github.com/emacs-exwm/xelb).
+;; It features:
+;; + Fully keyboard-driven operations
+;; + Hybrid layout modes (tiling & stacking)
+;; + Dynamic workspace support
+;; + ICCCM/EWMH compliance
+;; Optional features:
+;; + RandR (multi-monitor) support
+;; + System tray
+;; + Input method
+;; + Background setting support
+;; + XSETTINGS server
+
+;; Installation & configuration
+;; ----------------------------
+;; Here are the minimal steps to get EXWM working:
+;; 1. Install XELB and EXWM, and make sure they are in `load-path'.
+;; 2. In '~/.emacs', add following lines (please modify accordingly):
+;;
+;; (require 'exwm)
+;; (setq exwm-input-global-keys `(([?\s-r] . exwm-reset)))
+;; (exwm-enable)
+;;
+;; 3. Add the following lines to '~/.xinitrc':
+;;
+;; exec emacs
+;;
+;; 4. Launch EXWM in a console (e.g. tty1) with
+;;
+;; xinit -- vt01
+;;
+;; You should additionally hide the menu-bar, tool-bar, etc to increase the
+;; usable space. Please check the wiki (https://github.com/emacs-exwm/exwm/wiki)
+;; for more detailed instructions on installation, configuration, usage, etc.
+
+;; References:
+;; + dwm (http://dwm.suckless.org/)
+;; + i3 wm (https://i3wm.org/)
+;; + Also see references within each required library.
+
+;;; Code:
+
+(require 'server)
+(require 'exwm-core)
+(require 'exwm-workspace)
+(require 'exwm-layout)
+(require 'exwm-floating)
+(require 'exwm-manage)
+(require 'exwm-input)
+
+(declare-function x-get-atom-name "C source code" (VALUE &optional FRAME))
+
+(defgroup exwm nil
+ "Emacs X Window Manager."
+ :tag "EXWM"
+ :group 'applications
+ :prefix "exwm-")
+
+(defcustom exwm-init-hook nil
+ "Normal hook run when EXWM has just finished initialization."
+ :type 'hook)
+
+(defcustom exwm-exit-hook nil
+ "Normal hook run just before EXWM exits."
+ :type 'hook)
+
+(defcustom exwm-update-class-hook nil
+ "Normal hook run when window class is updated."
+ :type 'hook)
+
+(defcustom exwm-update-title-hook nil
+ "Normal hook run when window title is updated."
+ :type 'hook)
+
+(defcustom exwm-blocking-subrs
+ ;; `x-file-dialog' and `x-select-font' are missing on some Emacs builds, for
+ ;; example on the X11 Lucid build.
+ '(x-file-dialog x-popup-dialog x-select-font message-box message-or-box)
+ "Subrs (primitives) that would normally block EXWM."
+ :type '(repeat function))
+
+(defcustom exwm-replace 'ask
+ "Whether to replace existing window manager."
+ :type '(radio (const :tag "Ask" ask)
+ (const :tag "Replace by default" t)
+ (const :tag "Do not replace" nil)))
+
+(defconst exwm--server-name "server-exwm"
+ "Name of the subordinate Emacs server.")
+
+(defvar exwm--server-timeout 1
+ "Number of seconds to wait for the subordinate Emacs server to exit.
+After this time, the server will be killed.")
+
+(defvar exwm--server-process nil "Process of the subordinate Emacs server.")
+
+(defvar exwm--client-message-functions nil
+ "Alist of form ((MESSAGE . MESSAGE-HANDLER)...).
+Set during `exwm-init'.")
+
+(defun exwm-reset ()
+ "Reset the state of the selected window (non-fullscreen, line-mode, etc)."
+ (interactive)
+ (exwm--log)
+ (with-current-buffer (window-buffer)
+ (when (derived-mode-p 'exwm-mode)
+ (when (exwm-layout--fullscreen-p)
+ (exwm-layout-unset-fullscreen))
+ ;; Force refresh
+ (exwm-layout--refresh)
+ (call-interactively #'exwm-input-grab-keyboard))))
+
+(defun exwm-restart ()
+ "Restart EXWM."
+ (interactive)
+ (exwm--log)
+ (when (exwm--confirm-kill-emacs "Restart" 'no-check)
+ (let* ((attr (process-attributes (emacs-pid)))
+ (args (cdr (assq 'args attr)))
+ (ppid (cdr (assq 'ppid attr)))
+ (pargs (cdr (assq 'args (process-attributes ppid)))))
+ (cond
+ ((= ppid 1)
+ ;; The parent is the init process. This probably means this
+ ;; instance is an emacsclient. Anyway, start a control instance
+ ;; to manage the subsequent ones.
+ (call-process (car command-line-args))
+ (kill-emacs))
+ ((string= args pargs)
+ ;; This is a subordinate instance. Return a magic number to
+ ;; inform the parent (control instance) to start another one.
+ (kill-emacs ?R))
+ (t
+ ;; This is the control instance. Keep starting subordinate
+ ;; instances until told to exit.
+ ;; Run `server-force-stop' if it exists.
+ (run-hooks 'kill-emacs-hook)
+ (with-temp-buffer
+ (while (= ?R (shell-command-on-region (point) (point) args))))
+ (kill-emacs))))))
+
+(defun exwm--update-desktop (xwin)
+ "Update _NET_WM_DESKTOP.
+Argument XWIN contains the X window of the `exwm-mode' buffer."
+ (exwm--log "#x%x" xwin)
+ (with-current-buffer (exwm--id->buffer xwin)
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:ewmh:get-_NET_WM_DESKTOP
+ :window xwin)))
+ desktop)
+ (when reply
+ (setq desktop (slot-value reply 'value))
+ (cond
+ ((and desktop (= desktop 4294967295.))
+ (unless (or (not exwm--floating-frame)
+ (eq exwm--frame exwm-workspace--current)
+ (and exwm--desktop
+ (= desktop exwm--desktop)))
+ (exwm-layout--show xwin (frame-root-window exwm--floating-frame)))
+ (setq exwm--desktop desktop))
+ ((and desktop
+ (< desktop (exwm-workspace--count))
+ (if exwm--desktop
+ (/= desktop exwm--desktop)
+ (/= desktop (exwm-workspace--position exwm--frame))))
+ (exwm-workspace-move-window desktop xwin))
+ (t
+ (exwm-workspace--set-desktop xwin)))))))
+
+(defun exwm--update-window-type (id &optional force)
+ "Update `exwm-window-type' from _NET_WM_WINDOW_TYPE.
+Argument ID contains the X window of the `exwm-mode' buffer.
+
+When FORCE is nil the update only takes place if
+`exwm-window-type' is unset."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (and exwm-window-type (not force))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:ewmh:get-_NET_WM_WINDOW_TYPE
+ :window id))))
+ (when reply ;nil when destroyed
+ (setq exwm-window-type (append (slot-value reply 'value) nil)))))))
+
+(defun exwm--update-class (id &optional force)
+ "Update `exwm-instance-name' and `exwm-class' from WM_CLASS.
+Argument ID contains the X window of the `exwm-mode' buffer.
+
+When FORCE is nil the update only takes place if any of
+`exwm-instance-name' or `exwm-class' is unset."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (and exwm-instance-name exwm-class-name (not force))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:icccm:get-WM_CLASS :window id))))
+ (when reply ;nil when destroyed
+ (setq exwm-instance-name (slot-value reply 'instance-name)
+ exwm-class-name (slot-value reply 'class-name))
+ (when (and exwm-instance-name exwm-class-name)
+ (run-hooks 'exwm-update-class-hook)))))))
+
+(defun exwm--update-utf8-title (id &optional force)
+ "Update `exwm-title' from _NET_WM_NAME.
+Argument ID contains the X window of the `exwm-mode' buffer.
+
+When FORCE is nil the update only takes place if `exwm-title' is
+unset."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (when (or force (not exwm-title))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:ewmh:get-_NET_WM_NAME :window id))))
+ (when reply ;nil when destroyed
+ (setq exwm-title (slot-value reply 'value))
+ (when exwm-title
+ (setq exwm--title-is-utf8 t)
+ (run-hooks 'exwm-update-title-hook)))))))
+
+(defun exwm--update-ctext-title (id &optional force)
+ "Update `exwm-title' from WM_NAME.
+Argument ID contains the X window of the `exwm-mode' buffer.
+
+When FORCE is nil the update only takes place if `exwm-title' is
+unset."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (or exwm--title-is-utf8
+ (and exwm-title (not force)))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:icccm:get-WM_NAME :window id))))
+ (when reply ;nil when destroyed
+ (setq exwm-title (slot-value reply 'value))
+ (when exwm-title
+ (run-hooks 'exwm-update-title-hook)))))))
+
+(defun exwm--update-title (id)
+ "Update _NET_WM_NAME or WM_NAME.
+Argument ID contains the X window of the `exwm-mode' buffer."
+ (exwm--log "#x%x" id)
+ (exwm--update-utf8-title id)
+ (exwm--update-ctext-title id))
+
+(defun exwm--update-transient-for (id &optional force)
+ "Update `exwm-transient-for' from WM_TRANSIENT_FOR.
+Argument ID contains the X window of the `exwm-mode' buffer.
+
+When FORCE is nil the update only takes place if `exwm-title' is
+unset."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (and exwm-transient-for (not force))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:icccm:get-WM_TRANSIENT_FOR
+ :window id))))
+ (when reply ;nil when destroyed
+ (setq exwm-transient-for (slot-value reply 'value)))))))
+
+(defun exwm--update-normal-hints (id &optional force)
+ "Update normal hints from WM_NORMAL_HINTS.
+Argument ID contains the X window of the `exwm-mode' buffer.
+
+When FORCE is nil the update only takes place all of
+`exwm--normal-hints-x exwm--normal-hints-y',
+`exwm--normal-hints-width exwm--normal-hints-height',
+`exwm--normal-hints-min-width exwm--normal-hints-min-height' and
+`exwm--normal-hints-max-width exwm--normal-hints-max-height' are
+unset."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (and (not force)
+ (or exwm--normal-hints-x exwm--normal-hints-y
+ exwm--normal-hints-width exwm--normal-hints-height
+ exwm--normal-hints-min-width exwm--normal-hints-min-height
+ exwm--normal-hints-max-width exwm--normal-hints-max-height
+ ;; FIXME: other fields
+ ))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:icccm:get-WM_NORMAL_HINTS
+ :window id))))
+ (when (and reply (slot-value reply 'flags)) ;nil when destroyed
+ (with-slots (flags x y width height min-width min-height max-width
+ max-height base-width base-height ;; win-gravity
+ )
+ reply
+ (unless (= 0 (logand flags xcb:icccm:WM_SIZE_HINTS:USPosition))
+ (setq exwm--normal-hints-x x exwm--normal-hints-y y))
+ (unless (= 0 (logand flags xcb:icccm:WM_SIZE_HINTS:USSize))
+ (setq exwm--normal-hints-width width
+ exwm--normal-hints-height height))
+ (unless (= 0 (logand flags xcb:icccm:WM_SIZE_HINTS:PMinSize))
+ (setq exwm--normal-hints-min-width min-width
+ exwm--normal-hints-min-height min-height))
+ (unless (= 0 (logand flags xcb:icccm:WM_SIZE_HINTS:PMaxSize))
+ (setq exwm--normal-hints-max-width max-width
+ exwm--normal-hints-max-height max-height))
+ (unless (or exwm--normal-hints-min-width
+ (= 0 (logand flags xcb:icccm:WM_SIZE_HINTS:PBaseSize)))
+ (setq exwm--normal-hints-min-width base-width
+ exwm--normal-hints-min-height base-height))
+ ;; (unless (= 0 (logand flags xcb:icccm:WM_SIZE_HINTS:PWinGravity))
+ ;; (setq exwm--normal-hints-win-gravity win-gravity))
+ (setq exwm--fixed-size
+ (and exwm--normal-hints-min-width
+ exwm--normal-hints-min-height
+ exwm--normal-hints-max-width
+ exwm--normal-hints-max-height
+ (/= 0 exwm--normal-hints-min-width)
+ (/= 0 exwm--normal-hints-min-height)
+ (= exwm--normal-hints-min-width
+ exwm--normal-hints-max-width)
+ (= exwm--normal-hints-min-height
+ exwm--normal-hints-max-height)))))))))
+
+(defun exwm--update-hints (id &optional force)
+ "Update hints from WM_HINTS.
+Argument ID contains the X window of the `exwm-mode' buffer.
+
+When FORCE is nil the update only takes place if both of
+`exwm--hints-input' and `exwm--hints-urgency' are unset."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (and (not force) exwm--hints-input exwm--hints-urgency)
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:icccm:get-WM_HINTS :window id))))
+ (when (and reply (slot-value reply 'flags)) ;nil when destroyed
+ (with-slots (flags input initial-state) reply
+ (when flags
+ (unless (= 0 (logand flags xcb:icccm:WM_HINTS:InputHint))
+ (setq exwm--hints-input (when input (= 1 input))))
+ (unless (= 0 (logand flags xcb:icccm:WM_HINTS:StateHint))
+ (setq exwm-state initial-state))
+ (unless (= 0 (logand flags xcb:icccm:WM_HINTS:UrgencyHint))
+ (setq exwm--hints-urgency t))))
+ (when (and exwm--hints-urgency
+ (not (eq exwm--frame exwm-workspace--current)))
+ (unless (frame-parameter exwm--frame 'exwm-urgency)
+ (set-frame-parameter exwm--frame 'exwm-urgency t)
+ (setq exwm-workspace--switch-history-outdated t))))))))
+
+(defun exwm--update-protocols (id &optional force)
+ "Update `exwm--protocols' from WM_PROTOCOLS.
+Argument ID contains the X window of the `exwm-mode' buffer.
+
+When FORCE is nil the update only takes place if `exwm--protocols'
+is unset."
+ (exwm--log "#x%x" id)
+ (with-current-buffer (exwm--id->buffer id)
+ (unless (and exwm--protocols (not force))
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:icccm:get-WM_PROTOCOLS
+ :window id))))
+ (when reply ;nil when destroyed
+ (setq exwm--protocols (append (slot-value reply 'value) nil)))))))
+
+(defun exwm--update-struts-legacy (id)
+ "Update struts of X window ID from _NET_WM_STRUT."
+ (exwm--log "#x%x" id)
+ (let ((pair (assq id exwm-workspace--id-struts-alist))
+ reply struts)
+ (unless (and pair (< 4 (length (cdr pair))))
+ (setq reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:ewmh:get-_NET_WM_STRUT
+ :window id)))
+ (when reply
+ (setq struts (slot-value reply 'value))
+ (if pair
+ (setcdr pair struts)
+ (push (cons id struts) exwm-workspace--id-struts-alist))
+ (exwm-workspace--update-struts))
+ ;; Update workareas.
+ (exwm-workspace--update-workareas)
+ ;; Update workspaces.
+ (dolist (f exwm-workspace--list)
+ (exwm-workspace--set-fullscreen f)))))
+
+(defun exwm--update-struts-partial (id)
+ "Update struts of X window ID from _NET_WM_STRUT_PARTIAL."
+ (exwm--log "#x%x" id)
+ (let ((reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:ewmh:get-_NET_WM_STRUT_PARTIAL
+ :window id)))
+ struts pair)
+ (when reply
+ (setq struts (slot-value reply 'value)
+ pair (assq id exwm-workspace--id-struts-alist))
+ (if pair
+ (setcdr pair struts)
+ (push (cons id struts) exwm-workspace--id-struts-alist))
+ (exwm-workspace--update-struts))
+ ;; Update workareas.
+ (exwm-workspace--update-workareas)
+ ;; Update workspaces.
+ (dolist (f exwm-workspace--list)
+ (exwm-workspace--set-fullscreen f))))
+
+(defun exwm--update-struts (id)
+ "Update struts of X window ID from _NET_WM_STRUT_PARTIAL or _NET_WM_STRUT."
+ (exwm--log "#x%x" id)
+ (exwm--update-struts-partial id)
+ (exwm--update-struts-legacy id))
+
+(defun exwm--on-PropertyNotify (data _synthetic)
+ "Handle PropertyNotify event.
+DATA contains unmarshalled PropertyNotify event data."
+ (let ((obj (make-instance 'xcb:PropertyNotify))
+ atom id buffer)
+ (xcb:unmarshal obj data)
+ (setq id (slot-value obj 'window)
+ atom (slot-value obj 'atom))
+ (exwm--log "atom=%s(%s)" (x-get-atom-name atom exwm-workspace--current) atom)
+ (setq buffer (exwm--id->buffer id))
+ (if (not (buffer-live-p buffer))
+ ;; Properties of unmanaged X windows.
+ (cond ((= atom xcb:Atom:_NET_WM_STRUT)
+ (exwm--update-struts-legacy id))
+ ((= atom xcb:Atom:_NET_WM_STRUT_PARTIAL)
+ (exwm--update-struts-partial id)))
+ (with-current-buffer buffer
+ (cond ((= atom xcb:Atom:_NET_WM_WINDOW_TYPE)
+ (exwm--update-window-type id t))
+ ((= atom xcb:Atom:WM_CLASS)
+ (exwm--update-class id t))
+ ((= atom xcb:Atom:_NET_WM_NAME)
+ (exwm--update-utf8-title id t))
+ ((= atom xcb:Atom:WM_NAME)
+ (exwm--update-ctext-title id t))
+ ((= atom xcb:Atom:WM_TRANSIENT_FOR)
+ (exwm--update-transient-for id t))
+ ((= atom xcb:Atom:WM_NORMAL_HINTS)
+ (exwm--update-normal-hints id t))
+ ((= atom xcb:Atom:WM_HINTS)
+ (exwm--update-hints id t))
+ ((= atom xcb:Atom:WM_PROTOCOLS)
+ (exwm--update-protocols id t))
+ ((= atom xcb:Atom:_NET_WM_USER_TIME)) ;ignored
+ (t
+ (exwm--log "Unhandled: %s(%d)"
+ (x-get-atom-name atom exwm-workspace--current)
+ atom)))))))
+
+(defun exwm--on-net-number-of-desktops (_id data)
+ "Handle _NET_NUMBER_OF_DESKTOPS_ message with DATA."
+ (let ((current (exwm-workspace--count))
+ (requested (elt data 0)))
+ ;; Only allow increasing/decreasing the workspace number by 1.
+ (cond
+ ((< current requested)
+ (make-frame))
+ ((and (> current requested)
+ (> current 1))
+ (let ((frame (car (last exwm-workspace--list))))
+ (delete-frame frame))))))
+
+(defun exwm--on-net-current-desktop (_id data)
+ "Handle _NET_CURRENT_DESKTOP message with DATA."
+ (exwm-workspace-switch (elt data 0)))
+
+(defun exwm--on-net-active-window (id _data)
+ "Handle _NET_ACTIVE_WINDOW message with ID."
+ (let ((buffer (exwm--id->buffer id))
+ window)
+ (if (buffer-live-p buffer)
+ ;; Either an `exwm-mode' buffer (an X window) or a floating frame.
+ (with-current-buffer buffer
+ (when (eq exwm--frame exwm-workspace--current)
+ (if exwm--floating-frame
+ (select-frame exwm--floating-frame)
+ (setq window (get-buffer-window nil t))
+ (unless window
+ ;; State change: iconic => normal.
+ (setq window (frame-selected-window exwm--frame))
+ (set-window-buffer window (current-buffer)))
+ ;; Focus transfer.
+ (select-window window))))
+ ;; A workspace.
+ (dolist (f exwm-workspace--list)
+ (when (eq id (frame-parameter f 'exwm-outer-id))
+ (x-focus-frame f t))))))
+
+(defun exwm--on-net-close-window (id _data)
+ "Handle _NET_CLOSE_WINDOW message with ID."
+ (let ((buffer (exwm--id->buffer id)))
+ (when (buffer-live-p buffer)
+ (exwm--defer 0 #'kill-buffer buffer))))
+
+(defun exwm--on-net-wm-moveresize (id data)
+ "Handle _NET_WM_MOVERESIZE message with ID and DATA."
+ (let ((direction (elt data 2))
+ (buffer (exwm--id->buffer id)))
+ (unless (and buffer
+ (not (buffer-local-value 'exwm--floating-frame buffer)))
+ (cond ((= direction
+ xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_KEYBOARD)
+ ;; FIXME
+ )
+ ((= direction
+ xcb:ewmh:_NET_WM_MOVERESIZE_MOVE_KEYBOARD)
+ ;; FIXME
+ )
+ ((= direction xcb:ewmh:_NET_WM_MOVERESIZE_CANCEL)
+ (exwm-floating--stop-moveresize))
+ ;; In case it's a workspace frame.
+ ((and (not buffer)
+ (catch 'break
+ (dolist (f exwm-workspace--list)
+ (when (or (eq id (frame-parameter f 'exwm-outer-id))
+ (eq id (frame-parameter f 'exwm-id)))
+ (throw 'break t)))
+ nil)))
+ (t
+ ;; In case it's a floating frame,
+ ;; move the corresponding X window instead.
+ (unless buffer
+ (catch 'break
+ (dolist (pair exwm--id-buffer-alist)
+ (with-current-buffer (cdr pair)
+ (when
+ (and exwm--floating-frame
+ (or (eq id
+ (frame-parameter exwm--floating-frame
+ 'exwm-outer-id))
+ (eq id
+ (frame-parameter exwm--floating-frame
+ 'exwm-id))))
+ (setq id exwm--id)
+ (throw 'break nil))))))
+ ;; Start to move it.
+ (exwm-floating--start-moveresize id direction))))))
+
+(defun exwm--on-net-request-frame-extents (id _data)
+ "Handle _NET_REQUEST_FRAME_EXTENTS message with ID."
+ (let ((buffer (exwm--id->buffer id))
+ top btm)
+ (if (or (not buffer)
+ (not (buffer-local-value 'exwm--floating-frame buffer)))
+ (setq top 0
+ btm 0)
+ (setq top (window-header-line-height)
+ btm (window-mode-line-height)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_FRAME_EXTENTS
+ :window id
+ :left 0
+ :right 0
+ :top top
+ :bottom btm)))
+ (xcb:flush exwm--connection))
+
+(defun exwm--on-net-wm-desktop (id data)
+ "Handle _NET_WM_DESKTOP message with ID and DATA."
+ (let ((buffer (exwm--id->buffer id)))
+ (when (buffer-live-p buffer)
+ (exwm-workspace-move-window (elt data 0) id))))
+
+(defun exwm--on-net-wm-state (id data)
+ "Handle _NET_WM_STATE message with ID and DATA."
+ (let ((action (elt data 0))
+ (props (list (elt data 1) (elt data 2)))
+ (buffer (exwm--id->buffer id))
+ props-new)
+ ;; only support _NET_WM_STATE_FULLSCREEN / _NET_WM_STATE_ADD for frames
+ (when (and (not buffer)
+ (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN props)
+ (= action xcb:ewmh:_NET_WM_STATE_ADD))
+ (xcb:+request
+ exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_STATE
+ :window id
+ :data (vector xcb:Atom:_NET_WM_STATE_FULLSCREEN)))
+ (xcb:flush exwm--connection))
+ (when buffer ;ensure it's managed
+ (with-current-buffer buffer
+ ;; _NET_WM_STATE_FULLSCREEN
+ (when (or (memq xcb:Atom:_NET_WM_STATE_FULLSCREEN props)
+ (memq xcb:Atom:_NET_WM_STATE_ABOVE props))
+ (cond ((= action xcb:ewmh:_NET_WM_STATE_ADD)
+ (unless (exwm-layout--fullscreen-p)
+ (exwm-layout-set-fullscreen id))
+ (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new))
+ ((= action xcb:ewmh:_NET_WM_STATE_REMOVE)
+ (when (exwm-layout--fullscreen-p)
+ (exwm-layout-unset-fullscreen id)))
+ ((= action xcb:ewmh:_NET_WM_STATE_TOGGLE)
+ (if (exwm-layout--fullscreen-p)
+ (exwm-layout-unset-fullscreen id)
+ (exwm-layout-set-fullscreen id)
+ (push xcb:Atom:_NET_WM_STATE_FULLSCREEN props-new)))))
+ ;; _NET_WM_STATE_DEMANDS_ATTENTION
+ ;; FIXME: check (may require other properties set)
+ (when (memq xcb:Atom:_NET_WM_STATE_DEMANDS_ATTENTION props)
+ (when (= action xcb:ewmh:_NET_WM_STATE_ADD)
+ (unless (eq exwm--frame exwm-workspace--current)
+ (set-frame-parameter exwm--frame 'exwm-urgency t)
+ (setq exwm-workspace--switch-history-outdated t)))
+ ;; xcb:ewmh:_NET_WM_STATE_REMOVE?
+ ;; xcb:ewmh:_NET_WM_STATE_TOGGLE?
+ )
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_STATE
+ :window id :data (vconcat props-new)))
+ (xcb:flush exwm--connection)))))
+
+(defun exwm--on-wm-protocols (_id data)
+ "Handle WM_PROTOCOLS message with DATA."
+ (let ((type (elt data 0)))
+ (cond ((= type xcb:Atom:_NET_WM_PING)
+ (setq exwm-manage--ping-lock nil))
+ (t (exwm--log "Unhandled WM_PROTOCOLS of type: %d" type)))))
+
+(defun exwm--on-wm-change-state (id data)
+ "Handle WM_CHANGE_STATE message with ID and DATA."
+ (let ((buffer (exwm--id->buffer id)))
+ (when (and (buffer-live-p buffer)
+ (= (elt data 0) xcb:icccm:WM_STATE:IconicState))
+ (with-current-buffer buffer
+ (if exwm--floating-frame
+ (call-interactively #'exwm-floating-hide)
+ (bury-buffer))))))
+
+(defun exwm--on-ClientMessage (raw-data _synthetic)
+ "Handle ClientMessage event.
+RAW-DATA contains unmarshalled ClientMessage event data."
+ (let* ((obj (let ((m (make-instance 'xcb:ClientMessage)))
+ (xcb:unmarshal m raw-data)
+ m))
+ (type (slot-value obj 'type))
+ (id (slot-value obj 'window))
+ (data (slot-value (slot-value obj 'data) 'data32))
+ (fn (alist-get type exwm--client-message-functions)))
+ (if (not fn)
+ (exwm--log "Unhandled: %s(%d)"
+ (x-get-atom-name type exwm-workspace--current) type)
+ (exwm--log "atom=%s(%s) id=#x%x data=%s"
+ (x-get-atom-name type exwm-workspace--current)
+ type (or id 0) data)
+ (funcall fn id data))))
+
+(defun exwm--on-SelectionClear (data _synthetic)
+ "Handle SelectionClear events.
+DATA contains unmarshalled SelectionClear event data."
+ (exwm--log)
+ (let ((obj (make-instance 'xcb:SelectionClear))
+ owner selection)
+ (xcb:unmarshal obj data)
+ (setq owner (slot-value obj 'owner)
+ selection (slot-value obj 'selection))
+ (when (and (eq owner exwm--wmsn-window)
+ (eq selection xcb:Atom:WM_S0))
+ (exwm-exit))))
+
+(defun exwm--on-delete-terminal (terminal)
+ "Handle terminal being deleted without Emacs being killed.
+This function is Hooked to `delete-terminal-functions'.
+
+TERMINAL is the terminal being (or that has been) deleted.
+
+This may happen when invoking `save-buffers-kill-terminal' within an emacsclient
+session."
+ (when (eq terminal exwm--terminal)
+ (exwm-exit)))
+
+(defun exwm--init-icccm-ewmh ()
+ "Initialize ICCCM/EWMH support."
+ (exwm--log)
+ ;; Handle PropertyNotify event
+ (xcb:+event exwm--connection 'xcb:PropertyNotify #'exwm--on-PropertyNotify)
+ ;; Handle relevant client messages
+ (xcb:+event exwm--connection 'xcb:ClientMessage #'exwm--on-ClientMessage)
+ ;; Handle SelectionClear
+ (xcb:+event exwm--connection 'xcb:SelectionClear #'exwm--on-SelectionClear)
+ ;; Set _NET_SUPPORTED
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_SUPPORTED
+ :window exwm--root
+ :data (vector
+ ;; Root windows properties.
+ xcb:Atom:_NET_SUPPORTED
+ xcb:Atom:_NET_CLIENT_LIST
+ xcb:Atom:_NET_CLIENT_LIST_STACKING
+ xcb:Atom:_NET_NUMBER_OF_DESKTOPS
+ xcb:Atom:_NET_DESKTOP_GEOMETRY
+ xcb:Atom:_NET_DESKTOP_VIEWPORT
+ xcb:Atom:_NET_CURRENT_DESKTOP
+ ;; xcb:Atom:_NET_DESKTOP_NAMES
+ xcb:Atom:_NET_ACTIVE_WINDOW
+ ;; xcb:Atom:_NET_WORKAREA
+ xcb:Atom:_NET_SUPPORTING_WM_CHECK
+ ;; xcb:Atom:_NET_VIRTUAL_ROOTS
+ ;; xcb:Atom:_NET_DESKTOP_LAYOUT
+ ;; xcb:Atom:_NET_SHOWING_DESKTOP
+
+ ;; Other root window messages.
+ xcb:Atom:_NET_CLOSE_WINDOW
+ ;; xcb:Atom:_NET_MOVERESIZE_WINDOW
+ xcb:Atom:_NET_WM_MOVERESIZE
+ ;; xcb:Atom:_NET_RESTACK_WINDOW
+ xcb:Atom:_NET_REQUEST_FRAME_EXTENTS
+
+ ;; Application window properties.
+ xcb:Atom:_NET_WM_NAME
+ ;; xcb:Atom:_NET_WM_VISIBLE_NAME
+ ;; xcb:Atom:_NET_WM_ICON_NAME
+ ;; xcb:Atom:_NET_WM_VISIBLE_ICON_NAME
+ xcb:Atom:_NET_WM_DESKTOP
+ ;;
+ xcb:Atom:_NET_WM_WINDOW_TYPE
+ ;; xcb:Atom:_NET_WM_WINDOW_TYPE_DESKTOP
+ xcb:Atom:_NET_WM_WINDOW_TYPE_DOCK
+ xcb:Atom:_NET_WM_WINDOW_TYPE_TOOLBAR
+ xcb:Atom:_NET_WM_WINDOW_TYPE_MENU
+ xcb:Atom:_NET_WM_WINDOW_TYPE_UTILITY
+ xcb:Atom:_NET_WM_WINDOW_TYPE_SPLASH
+ xcb:Atom:_NET_WM_WINDOW_TYPE_DIALOG
+ xcb:Atom:_NET_WM_WINDOW_TYPE_DROPDOWN_MENU
+ xcb:Atom:_NET_WM_WINDOW_TYPE_POPUP_MENU
+ xcb:Atom:_NET_WM_WINDOW_TYPE_TOOLTIP
+ xcb:Atom:_NET_WM_WINDOW_TYPE_NOTIFICATION
+ xcb:Atom:_NET_WM_WINDOW_TYPE_COMBO
+ xcb:Atom:_NET_WM_WINDOW_TYPE_DND
+ xcb:Atom:_NET_WM_WINDOW_TYPE_NORMAL
+ ;;
+ xcb:Atom:_NET_WM_STATE
+ ;; xcb:Atom:_NET_WM_STATE_MODAL
+ ;; xcb:Atom:_NET_WM_STATE_STICKY
+ ;; xcb:Atom:_NET_WM_STATE_MAXIMIZED_VERT
+ ;; xcb:Atom:_NET_WM_STATE_MAXIMIZED_HORZ
+ ;; xcb:Atom:_NET_WM_STATE_SHADED
+ ;; xcb:Atom:_NET_WM_STATE_SKIP_TASKBAR
+ ;; xcb:Atom:_NET_WM_STATE_SKIP_PAGER
+ xcb:Atom:_NET_WM_STATE_HIDDEN
+ xcb:Atom:_NET_WM_STATE_FULLSCREEN
+ ;; xcb:Atom:_NET_WM_STATE_ABOVE
+ ;; xcb:Atom:_NET_WM_STATE_BELOW
+ xcb:Atom:_NET_WM_STATE_DEMANDS_ATTENTION
+ ;; xcb:Atom:_NET_WM_STATE_FOCUSED
+ ;;
+ xcb:Atom:_NET_WM_ALLOWED_ACTIONS
+ xcb:Atom:_NET_WM_ACTION_MOVE
+ xcb:Atom:_NET_WM_ACTION_RESIZE
+ xcb:Atom:_NET_WM_ACTION_MINIMIZE
+ ;; xcb:Atom:_NET_WM_ACTION_SHADE
+ ;; xcb:Atom:_NET_WM_ACTION_STICK
+ ;; xcb:Atom:_NET_WM_ACTION_MAXIMIZE_HORZ
+ ;; xcb:Atom:_NET_WM_ACTION_MAXIMIZE_VERT
+ xcb:Atom:_NET_WM_ACTION_FULLSCREEN
+ xcb:Atom:_NET_WM_ACTION_CHANGE_DESKTOP
+ xcb:Atom:_NET_WM_ACTION_CLOSE
+ ;; xcb:Atom:_NET_WM_ACTION_ABOVE
+ ;; xcb:Atom:_NET_WM_ACTION_BELOW
+ ;;
+ xcb:Atom:_NET_WM_STRUT
+ xcb:Atom:_NET_WM_STRUT_PARTIAL
+ ;; xcb:Atom:_NET_WM_ICON_GEOMETRY
+ ;; xcb:Atom:_NET_WM_ICON
+ xcb:Atom:_NET_WM_PID
+ ;; xcb:Atom:_NET_WM_HANDLED_ICONS
+ ;; xcb:Atom:_NET_WM_USER_TIME
+ ;; xcb:Atom:_NET_WM_USER_TIME_WINDOW
+ xcb:Atom:_NET_FRAME_EXTENTS
+ ;; xcb:Atom:_NET_WM_OPAQUE_REGION
+ ;; xcb:Atom:_NET_WM_BYPASS_COMPOSITOR
+
+ ;; Window manager protocols.
+ xcb:Atom:_NET_WM_PING
+ ;; xcb:Atom:_NET_WM_SYNC_REQUEST
+ ;; xcb:Atom:_NET_WM_FULLSCREEN_MONITORS
+
+ ;; Other properties.
+ xcb:Atom:_NET_WM_FULL_PLACEMENT)))
+ ;; Create a child window for setting _NET_SUPPORTING_WM_CHECK
+ (let ((new-id (xcb:generate-id exwm--connection)))
+ (setq exwm--guide-window new-id)
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:CreateWindow
+ :depth 0
+ :wid new-id
+ :parent exwm--root
+ :x -1
+ :y -1
+ :width 1
+ :height 1
+ :border-width 0
+ :class xcb:WindowClass:InputOnly
+ :visual 0
+ :value-mask xcb:CW:OverrideRedirect
+ :override-redirect 1))
+ ;; Set _NET_WM_NAME. Must be set to the name of the window manager, as
+ ;; required by wm-spec.
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window new-id :data "EXWM"))
+ (dolist (i (list exwm--root new-id))
+ ;; Set _NET_SUPPORTING_WM_CHECK
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_SUPPORTING_WM_CHECK
+ :window i :data new-id))))
+ ;; Set _NET_DESKTOP_VIEWPORT (we don't support large desktop).
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_DESKTOP_VIEWPORT
+ :window exwm--root
+ :data [0 0]))
+ (xcb:flush exwm--connection))
+
+(defun exwm--wmsn-acquire (replace)
+ "Acquire the WM_Sn selection.
+
+REPLACE specifies what to do in case there already is a window
+manager. If t, replace it, if nil, abort and ask the user if `ask'."
+ (exwm--log "%s" replace)
+ (with-slots (owner)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetSelectionOwner
+ :selection xcb:Atom:WM_S0))
+ (when (/= owner xcb:Window:None)
+ (when (eq replace 'ask)
+ (setq replace (yes-or-no-p "Replace existing window manager? ")))
+ (when (not replace)
+ (user-error "Other window manager detected")))
+ (let ((new-owner (xcb:generate-id exwm--connection)))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:CreateWindow
+ :depth 0
+ :wid new-owner
+ :parent exwm--root
+ :x -1
+ :y -1
+ :width 1
+ :height 1
+ :border-width 0
+ :class xcb:WindowClass:CopyFromParent
+ :visual 0
+ :value-mask 0
+ :override-redirect 0))
+ (xcb:+request exwm--connection
+ (make-instance 'xcb:ewmh:set-_NET_WM_NAME
+ :window new-owner :data "EXWM: exwm--wmsn-window"))
+ (xcb:+request-checked+request-check exwm--connection
+ (make-instance 'xcb:SetSelectionOwner
+ :selection xcb:Atom:WM_S0
+ :owner new-owner
+ :time xcb:Time:CurrentTime))
+ (with-slots (owner)
+ (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetSelectionOwner
+ :selection xcb:Atom:WM_S0))
+ (unless (eq owner new-owner)
+ (error "Could not acquire ownership of WM selection")))
+ ;; Wait for the other window manager to terminate.
+ (when (/= owner xcb:Window:None)
+ (let (reply)
+ (cl-dotimes (i exwm--wmsn-acquire-timeout)
+ (setq reply (xcb:+request-unchecked+reply exwm--connection
+ (make-instance 'xcb:GetGeometry :drawable owner)))
+ (when (not reply)
+ (cl-return))
+ (message "Waiting for other window manager to quit... %ds" i)
+ (sleep-for 1))
+ (when reply
+ (error "Other window manager did not release selection in time"))))
+ ;; announce
+ (let* ((cmd (make-instance 'xcb:ClientMessageData
+ :data32 (vector xcb:Time:CurrentTime
+ xcb:Atom:WM_S0
+ new-owner
+ 0
+ 0)))
+ (cm (make-instance 'xcb:ClientMessage
+ :window exwm--root
+ :format 32
+ :type xcb:Atom:MANAGER
+ :data cmd))
+ (se (make-instance 'xcb:SendEvent
+ :propagate 0
+ :destination exwm--root
+ :event-mask xcb:EventMask:NoEvent
+ :event (xcb:marshal cm exwm--connection))))
+ (xcb:+request exwm--connection se))
+ (setq exwm--wmsn-window new-owner))))
+
+(cl-defun exwm-init (&optional frame)
+ "Initialize EXWM.
+FRAME, if given, indicates the X display EXWM should manage."
+ (interactive)
+ (exwm--log "%s" frame)
+ (if frame
+ ;; The frame might not be selected if it's created by emacslicnet.
+ (select-frame-set-input-focus frame)
+ (setq frame (selected-frame)))
+ (when (not (eq 'x (framep frame)))
+ (message "[EXWM] Not running under X environment")
+ (cl-return-from exwm-init))
+ (when exwm--connection
+ (exwm--log "EXWM already running")
+ (cl-return-from exwm-init))
+ (condition-case err
+ (progn
+ (exwm-enable 'undo) ;never initialize again
+ (setq exwm--terminal (frame-terminal frame))
+ (setq exwm--connection (xcb:connect))
+ (set-process-query-on-exit-flag (slot-value exwm--connection 'process)
+ nil) ;prevent query message on exit
+ (setq exwm--root
+ (slot-value (car (slot-value
+ (xcb:get-setup exwm--connection) 'roots))
+ 'root))
+ ;; Initialize ICCCM/EWMH support
+ (xcb:icccm:init exwm--connection t)
+ (xcb:ewmh:init exwm--connection t)
+ (setq
+ exwm--client-message-functions
+ (list (cons xcb:Atom:_NET_NUMBER_OF_DESKTOPS #'exwm--on-net-number-of-desktops)
+ (cons xcb:Atom:_NET_CURRENT_DESKTOP #'exwm--on-net-current-desktop)
+ (cons xcb:Atom:_NET_ACTIVE_WINDOW #'exwm--on-net-active-window)
+ (cons xcb:Atom:_NET_CLOSE_WINDOW #'exwm--on-net-close-window)
+ (cons xcb:Atom:_NET_REQUEST_FRAME_EXTENTS
+ #'exwm--on-net-request-frame-extents)
+ (cons xcb:Atom:_NET_WM_DESKTOP #'exwm--on-net-wm-desktop)
+ (cons xcb:Atom:_NET_WM_STATE #'exwm--on-net-wm-state)
+ (cons xcb:Atom:WM_PROTOCOLS #'exwm--on-wm-protocols)
+ (cons xcb:Atom:WM_CHANGE_STATE #'exwm--on-wm-change-state)))
+ ;; Try to register window manager selection.
+ (exwm--wmsn-acquire exwm-replace)
+ (when (xcb:+request-checked+request-check exwm--connection
+ (make-instance 'xcb:ChangeWindowAttributes
+ :window exwm--root
+ :value-mask xcb:CW:EventMask
+ :event-mask
+ xcb:EventMask:SubstructureRedirect))
+ (error "Other window manager is running"))
+ ;; Disable some features not working well with EXWM
+ (setq use-dialog-box nil
+ confirm-kill-emacs #'exwm--confirm-kill-emacs)
+ (advice-add 'save-buffers-kill-terminal
+ :before-while #'exwm--confirm-kill-terminal)
+ ;; Clean up if the terminal is deleted.
+ (add-hook 'delete-terminal-functions 'exwm--on-delete-terminal)
+ (exwm--lock)
+ (exwm--init-icccm-ewmh)
+ (exwm-layout--init)
+ (exwm-floating--init)
+ (exwm-manage--init)
+ (exwm-workspace--init)
+ (exwm-input--init)
+ (exwm--unlock)
+ (exwm-workspace--post-init)
+ (exwm-input--post-init)
+ (run-hooks 'exwm-init-hook)
+ ;; Manage existing windows
+ (exwm-manage--scan))
+ (user-error)
+ ((quit error)
+ (exwm-exit)
+ ;; Rethrow error
+ (warn "[EXWM] EXWM fails to start (%s: %s)" (car err) (cdr err)))))
+
+
+(defun exwm-exit ()
+ "Exit EXWM."
+ (interactive)
+ (exwm--log)
+ (run-hooks 'exwm-exit-hook)
+ (setq confirm-kill-emacs nil)
+ ;; Exit modules.
+ (when exwm--connection
+ (exwm-input--exit)
+ (exwm-manage--exit)
+ (exwm-workspace--exit)
+ (exwm-floating--exit)
+ (exwm-layout--exit)
+ (xcb:flush exwm--connection)
+ (xcb:disconnect exwm--connection))
+ (setq exwm--connection nil)
+ (setq exwm--terminal nil)
+ (setenv "INSIDE_EXWM" nil)
+ (exwm--log "Exited"))
+
+;;;###autoload
+(defun exwm-enable (&optional undo)
+ "Enable/Disable EXWM.
+Optional argument UNDO may be either of the following symbols:
+- `undo' prevents reinitialization.
+- `undo-all' attempts to revert all hooks and advice."
+ (exwm--log "%s" undo)
+ (pcase undo
+ (`undo ;prevent reinitialization
+ (remove-hook 'window-setup-hook #'exwm-init)
+ (remove-hook 'after-make-frame-functions #'exwm-init))
+ (`undo-all ;attempt to revert everything
+ (remove-hook 'window-setup-hook #'exwm-init)
+ (remove-hook 'after-make-frame-functions #'exwm-init)
+ (remove-hook 'kill-emacs-hook #'exwm--server-stop)
+ (dolist (i exwm-blocking-subrs)
+ (advice-remove i #'exwm--server-eval-at)))
+ (_ ;enable EXWM
+ (setq frame-resize-pixelwise t ;mandatory; before init
+ window-resize-pixelwise t
+ x-no-window-manager t)
+ (setenv "INSIDE_EXWM" "1")
+ ;; Ignore unrecognized command line arguments. This can be helpful
+ ;; when EXWM is launched by some session manager.
+ (push #'vector command-line-functions)
+ ;; In case EXWM is to be started from a graphical Emacs instance.
+ (add-hook 'window-setup-hook #'exwm-init t)
+ ;; In case EXWM is to be started with emacsclient.
+ (add-hook 'after-make-frame-functions #'exwm-init t)
+ ;; Manage the subordinate Emacs server.
+ (add-hook 'kill-emacs-hook #'exwm--server-stop)
+ (dolist (i exwm-blocking-subrs)
+ (advice-add i :around #'exwm--server-eval-at)))))
+
+(defun exwm--server-stop ()
+ "Stop the subordinate Emacs server."
+ (exwm--log)
+ (when exwm--server-process
+ (when (process-live-p exwm--server-process)
+ (cl-loop
+ initially (signal-process exwm--server-process 'TERM)
+ while (process-live-p exwm--server-process)
+ repeat (* 10 exwm--server-timeout)
+ do (sit-for 0.1)))
+ (delete-process exwm--server-process)
+ (setq exwm--server-process nil)))
+
+(defun exwm--server-eval-at (function &rest args)
+ "Wrapper of `server-eval-at' used to advice subrs.
+FUNCTION is the function to be evaluated, ARGS are the arguments."
+ ;; Start the subordinate Emacs server if it's not alive
+ (exwm--log "%s %s" function args)
+ (unless (server-running-p exwm--server-name)
+ (when exwm--server-process (delete-process exwm--server-process))
+ (setq exwm--server-process
+ (start-process exwm--server-name
+ nil
+ (car command-line-args) ;The executable file
+ "-d" (frame-parameter nil 'display)
+ "-Q"
+ (concat "--fg-daemon=" exwm--server-name)
+ "--eval"
+ ;; Create an invisible frame
+ "(make-frame '((window-system . x) (visibility)))"))
+ (while (not (server-running-p exwm--server-name))
+ (sit-for 0.001)))
+ (server-eval-at
+ exwm--server-name
+ `(progn (select-frame (car (frame-list)))
+ (let ((result ,(nconc (list (make-symbol (subr-name function)))
+ args)))
+ (pcase (type-of result)
+ ;; Return the name of a buffer
+ (`buffer (buffer-name result))
+ ;; We blindly convert all font objects to their XLFD names. This
+ ;; might cause problems of course, but it still has a chance to
+ ;; work (whereas directly passing font objects would merely
+ ;; raise errors).
+ ((or `font-entity `font-object `font-spec)
+ (font-xlfd-name result))
+ ;; Passing following types makes little sense
+ ((or `compiled-function `finalizer `frame `hash-table `marker
+ `overlay `process `window `window-configuration))
+ ;; Passing the name of a subr
+ (`subr (make-symbol (subr-name result)))
+ ;; For other types, return the value as-is.
+ (t result))))))
+
+(defun exwm--confirm-kill-terminal (&optional _)
+ "Confirm before killing terminal."
+ ;; This is invoked instead of `save-buffers-kill-emacs' (C-x C-c) on client
+ ;; frames.
+ (if (exwm--terminal-p)
+ (exwm--confirm-kill-emacs "Kill terminal")
+ t))
+
+(defun exwm--confirm-kill-emacs (prompt &optional force)
+ "Confirm before exiting Emacs.
+PROMPT a reason to present to the user.
+If FORCE is nil, ask the user for confirmation.
+If FORCE is the symbol `no-check', ask if there are unsaved buffers.
+If FORCE is any other non-nil value, force killing of Emacs."
+ (exwm--log)
+ (when (cond
+ ((and force (not (eq force 'no-check)))
+ ;; Force killing Emacs.
+ t)
+ ((or (eq force 'no-check) (not exwm--id-buffer-alist))
+ ;; Check if there's any unsaved file.
+ (pcase (catch 'break
+ (let ((kill-emacs-query-functions
+ (append kill-emacs-query-functions
+ (list (lambda ()
+ (throw 'break 'break))))))
+ (save-buffers-kill-emacs)))
+ (`break (y-or-n-p prompt))
+ (x x)))
+ (t
+ (yes-or-no-p (format "[EXWM] %d X window(s) will be destroyed. %s?"
+ (length exwm--id-buffer-alist) prompt))))
+ ;; Run `kill-emacs-hook' (`server-force-stop' excluded) before Emacs
+ ;; frames are unmapped so that errors (if any) can be visible.
+ (if (memq #'server-force-stop kill-emacs-hook)
+ (progn
+ (setq kill-emacs-hook (delq #'server-force-stop kill-emacs-hook))
+ (run-hooks 'kill-emacs-hook)
+ (setq kill-emacs-hook (list #'server-force-stop)))
+ (run-hooks 'kill-emacs-hook)
+ (setq kill-emacs-hook nil))
+ ;; Exit each module, destroying all resources created by this connection.
+ (exwm-exit)
+ ;; Set the return value.
+ t))
+
+(provide 'exwm)
+;;; exwm.el ends here
diff --git a/elpa/exwm-0.33/exwm.elc b/elpa/exwm-0.33/exwm.elc
new file mode 100644
index 0000000..1ad4abb
--- /dev/null
+++ b/elpa/exwm-0.33/exwm.elc
Binary files differ
diff --git a/elpa/gnupg/pubring.kbx b/elpa/gnupg/pubring.kbx
new file mode 100644
index 0000000..ebf6014
--- /dev/null
+++ b/elpa/gnupg/pubring.kbx
Binary files differ
diff --git a/elpa/gnupg/pubring.kbx~ b/elpa/gnupg/pubring.kbx~
new file mode 100644
index 0000000..872b355
--- /dev/null
+++ b/elpa/gnupg/pubring.kbx~
Binary files differ
diff --git a/elpa/gnupg/trustdb.gpg b/elpa/gnupg/trustdb.gpg
new file mode 100644
index 0000000..bf6eabd
--- /dev/null
+++ b/elpa/gnupg/trustdb.gpg
Binary files differ
diff --git a/elpa/gruber-darker-theme-0.7.signed b/elpa/gruber-darker-theme-0.7.signed
new file mode 100644
index 0000000..9447776
--- /dev/null
+++ b/elpa/gruber-darker-theme-0.7.signed
@@ -0,0 +1 @@
+Good signature from 645357D2883A0966 GNU ELPA Signing Agent (2023) <elpasign@elpa.gnu.org> (trust undefined) created at 2024-03-31T11:15:09+0000 using EDDSA \ No newline at end of file
diff --git a/elpa/gruber-darker-theme-0.7/README-elpa b/elpa/gruber-darker-theme-0.7/README-elpa
new file mode 100644
index 0000000..93d70f6
--- /dev/null
+++ b/elpa/gruber-darker-theme-0.7/README-elpa
@@ -0,0 +1,78 @@
+[![MELPA](http://melpa.org/packages/gruber-darker-theme-badge.svg)](http://melpa.org/#/gruber-darker-theme)
+[![MELPA Stable](http://stable.melpa.org/packages/gruber-darker-theme-badge.svg)](http://stable.melpa.org/#/gruber-darker-theme)
+
+# Gruber Darker #
+
+[Gruber Darker](http://jblevins.org/projects/emacs-color-themes/color-theme-gruber-darker.el.html)
+color theme for Emacs by Jason Blevins. A darker variant of the
+[Gruber Dark](http://daringfireball.net/projects/bbcolors/schemes/)
+theme for BBEdit by John Gruber. Adapted for deftheme and extended by
+Alexey Kutepov a.k.a. rexim.
+
+# Screenshot #
+
+![gruber-darker-theme](http://i.imgur.com/8dY71hX.png)
+
+# Installation #
+
+You can use built-in package manager (package.el) or do everything by
+your hands.
+
+## Using package manager ##
+
+This theme is available on two repositories:
+[MELPA](http://melpa.milkbox.net/) and
+[Marmalade](http://marmalade-repo.org/). Add the following to your
+emacs config file somewhere (.emacs, init.el, whatever)
+
+```
+(require 'package)
+(add-to-list 'package-archives
+ '("melpa" . "http://melpa.milkbox.net/packages/") t)
+```
+
+for [MELPA](http://melpa.milkbox.net/), or
+
+```
+(require 'package)
+(add-to-list 'package-archives
+ '("marmalade" . "http://marmalade-repo.org/packages/") t)
+```
+
+for [Marmalade](http://marmalade-repo.org/).
+
+I personally prefer [MELPA](http://melpa.milkbox.net/), 'cause it
+hourly updates its packages from upstream source.
+
+Then use `M-x package-install RET gruber-darker-theme RET` to install
+the theme. Use `M-x customize-themes` to change your current theme.
+
+## Manual old fashioned way ##
+
+Download the theme to your local directory. You can do it through `git
+clone` command:
+
+```
+git clone git://github.com/rexim/gruber-darker-theme.git
+```
+
+Then add path to gruber-darker-theme to custom-theme-load-path list —
+add the following to your emacs config file somewhere (.emacs,
+init.el, whatever):
+
+```
+(add-to-list 'custom-theme-load-path
+ "/path/to/gruber-darker-theme/")
+```
+
+Use `M-x customize-themes` to change your current theme.
+
+# Contribution #
+
+Gruber Darker is an awesome theme. But it has a lack of support for
+many good modes. I add color faces only for modes I use. If you like
+this theme and use a mode that looks very bad with it, feel free to
+add appropriate color faces (see file gruber-darker-theme.el) and send
+me a pull request.
+
+Thanks.
diff --git a/elpa/gruber-darker-theme-0.7/README.md b/elpa/gruber-darker-theme-0.7/README.md
new file mode 100644
index 0000000..93d70f6
--- /dev/null
+++ b/elpa/gruber-darker-theme-0.7/README.md
@@ -0,0 +1,78 @@
+[![MELPA](http://melpa.org/packages/gruber-darker-theme-badge.svg)](http://melpa.org/#/gruber-darker-theme)
+[![MELPA Stable](http://stable.melpa.org/packages/gruber-darker-theme-badge.svg)](http://stable.melpa.org/#/gruber-darker-theme)
+
+# Gruber Darker #
+
+[Gruber Darker](http://jblevins.org/projects/emacs-color-themes/color-theme-gruber-darker.el.html)
+color theme for Emacs by Jason Blevins. A darker variant of the
+[Gruber Dark](http://daringfireball.net/projects/bbcolors/schemes/)
+theme for BBEdit by John Gruber. Adapted for deftheme and extended by
+Alexey Kutepov a.k.a. rexim.
+
+# Screenshot #
+
+![gruber-darker-theme](http://i.imgur.com/8dY71hX.png)
+
+# Installation #
+
+You can use built-in package manager (package.el) or do everything by
+your hands.
+
+## Using package manager ##
+
+This theme is available on two repositories:
+[MELPA](http://melpa.milkbox.net/) and
+[Marmalade](http://marmalade-repo.org/). Add the following to your
+emacs config file somewhere (.emacs, init.el, whatever)
+
+```
+(require 'package)
+(add-to-list 'package-archives
+ '("melpa" . "http://melpa.milkbox.net/packages/") t)
+```
+
+for [MELPA](http://melpa.milkbox.net/), or
+
+```
+(require 'package)
+(add-to-list 'package-archives
+ '("marmalade" . "http://marmalade-repo.org/packages/") t)
+```
+
+for [Marmalade](http://marmalade-repo.org/).
+
+I personally prefer [MELPA](http://melpa.milkbox.net/), 'cause it
+hourly updates its packages from upstream source.
+
+Then use `M-x package-install RET gruber-darker-theme RET` to install
+the theme. Use `M-x customize-themes` to change your current theme.
+
+## Manual old fashioned way ##
+
+Download the theme to your local directory. You can do it through `git
+clone` command:
+
+```
+git clone git://github.com/rexim/gruber-darker-theme.git
+```
+
+Then add path to gruber-darker-theme to custom-theme-load-path list —
+add the following to your emacs config file somewhere (.emacs,
+init.el, whatever):
+
+```
+(add-to-list 'custom-theme-load-path
+ "/path/to/gruber-darker-theme/")
+```
+
+Use `M-x customize-themes` to change your current theme.
+
+# Contribution #
+
+Gruber Darker is an awesome theme. But it has a lack of support for
+many good modes. I add color faces only for modes I use. If you like
+this theme and use a mode that looks very bad with it, feel free to
+add appropriate color faces (see file gruber-darker-theme.el) and send
+me a pull request.
+
+Thanks.
diff --git a/elpa/gruber-darker-theme-0.7/gruber-darker-theme-autoloads.el b/elpa/gruber-darker-theme-0.7/gruber-darker-theme-autoloads.el
new file mode 100644
index 0000000..94b1b8c
--- /dev/null
+++ b/elpa/gruber-darker-theme-0.7/gruber-darker-theme-autoloads.el
@@ -0,0 +1,29 @@
+;;; gruber-darker-theme-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*-
+;; Generated by the `loaddefs-generate' function.
+
+;; This file is part of GNU Emacs.
+
+;;; Code:
+
+(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path)))
+
+
+
+;;; Generated autoloads from gruber-darker-theme.el
+
+(when load-file-name (add-to-list 'custom-theme-load-path (file-name-as-directory (file-name-directory load-file-name))))
+(register-definition-prefixes "gruber-darker-theme" '("gruber-darker"))
+
+;;; End of scraped data
+
+(provide 'gruber-darker-theme-autoloads)
+
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; no-native-compile: t
+;; coding: utf-8-emacs-unix
+;; End:
+
+;;; gruber-darker-theme-autoloads.el ends here
diff --git a/elpa/gruber-darker-theme-0.7/gruber-darker-theme-pkg.el b/elpa/gruber-darker-theme-0.7/gruber-darker-theme-pkg.el
new file mode 100644
index 0000000..cf1438a
--- /dev/null
+++ b/elpa/gruber-darker-theme-0.7/gruber-darker-theme-pkg.el
@@ -0,0 +1,2 @@
+;; Generated package description from gruber-darker-theme.el -*- no-byte-compile: t -*-
+(define-package "gruber-darker-theme" "0.7" "Gruber Darker color theme for Emacs 24." 'nil :commit "13e13ea1e2ebd146f279058970835b35de811531" :authors '(("Alexey Kutepov" . "reximkut@gmail.com")) :maintainer '("Alexey Kutepov" . "reximkut@gmail.com") :url "http://github.com/rexim/gruber-darker-theme")
diff --git a/elpa/gruber-darker-theme-0.7/gruber-darker-theme.el b/elpa/gruber-darker-theme-0.7/gruber-darker-theme.el
new file mode 100644
index 0000000..27d7093
--- /dev/null
+++ b/elpa/gruber-darker-theme-0.7/gruber-darker-theme.el
@@ -0,0 +1,400 @@
+;;; gruber-darker-theme.el --- Gruber Darker color theme for Emacs 24.
+
+;; Copyright (C) 2013-2016 Alexey Kutepov a.k.a rexim
+;; Copyright (C) 2009-2010 Jason R. Blevins
+
+;; Author: Alexey Kutepov <reximkut@gmail.com>
+;; URL: http://github.com/rexim/gruber-darker-theme
+;; Version: 0.7
+
+;; 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:
+;;
+;; Gruber Darker color theme for Emacs by Jason Blevins. A darker
+;; variant of the Gruber Dark theme for BBEdit by John Gruber. Adapted
+;; for deftheme and extended by Alexey Kutepov a.k.a. rexim.
+
+
+(deftheme gruber-darker
+ "Gruber Darker color theme for Emacs 24")
+
+;; Please, install rainbow-mode.
+;; Colors with +x are lighter. Colors with -x are darker.
+(let ((gruber-darker-fg "#e4e4ef")
+ (gruber-darker-fg+1 "#f4f4ff")
+ (gruber-darker-fg+2 "#f5f5f5")
+ (gruber-darker-white "#ffffff")
+ (gruber-darker-black "#000000")
+ (gruber-darker-bg-1 "#101010")
+ (gruber-darker-bg "#181818")
+ (gruber-darker-bg+1 "#282828")
+ (gruber-darker-bg+2 "#453d41")
+ (gruber-darker-bg+3 "#484848")
+ (gruber-darker-bg+4 "#52494e")
+ (gruber-darker-red-1 "#c73c3f")
+ (gruber-darker-red "#f43841")
+ (gruber-darker-red+1 "#ff4f58")
+ (gruber-darker-green "#73c936")
+ (gruber-darker-yellow "#ffdd33")
+ (gruber-darker-brown "#cc8c3c")
+ (gruber-darker-quartz "#95a99f")
+ (gruber-darker-niagara-2 "#303540")
+ (gruber-darker-niagara-1 "#565f73")
+ (gruber-darker-niagara "#96a6c8")
+ (gruber-darker-wisteria "#9e95c7")
+ )
+ (custom-theme-set-variables
+ 'gruber-darker
+ '(frame-brackground-mode (quote dark)))
+
+ (custom-theme-set-faces
+ 'gruber-darker
+
+ ;; Agda2
+ `(agda2-highlight-datatype-face ((t (:foreground ,gruber-darker-quartz))))
+ `(agda2-highlight-primitive-type-face ((t (:foreground ,gruber-darker-quartz))))
+ `(agda2-highlight-function-face ((t (:foreground ,gruber-darker-niagara))))
+ `(agda2-highlight-keyword-face ((t ,(list :foreground gruber-darker-yellow
+ :bold t))))
+ `(agda2-highlight-inductive-constructor-face ((t (:foreground ,gruber-darker-green))))
+ `(agda2-highlight-number-face ((t (:foreground ,gruber-darker-wisteria))))
+
+ ;; AUCTeX
+ `(font-latex-bold-face ((t (:foreground ,gruber-darker-quartz :bold t))))
+ `(font-latex-italic-face ((t (:foreground ,gruber-darker-quartz :italic t))))
+ `(font-latex-math-face ((t (:foreground ,gruber-darker-green))))
+ `(font-latex-sectioning-5-face ((t ,(list :foreground gruber-darker-niagara
+ :bold t))))
+ `(font-latex-slide-title-face ((t (:foreground ,gruber-darker-niagara))))
+ `(font-latex-string-face ((t (:foreground ,gruber-darker-green))))
+ `(font-latex-warning-face ((t (:foreground ,gruber-darker-red))))
+
+ ;; Basic Coloring (or Uncategorized)
+ `(border ((t ,(list :background gruber-darker-bg-1
+ :foreground gruber-darker-bg+2))))
+ `(cursor ((t (:background ,gruber-darker-yellow))))
+ `(default ((t ,(list :foreground gruber-darker-fg
+ :background gruber-darker-bg))))
+ `(fringe ((t ,(list :background gruber-darker-bg-1
+ :foreground gruber-darker-bg+2))))
+ `(link ((t (:foreground ,gruber-darker-niagara :underline t))))
+ `(link-visited ((t (:foreground ,gruber-darker-wisteria :underline t))))
+ `(match ((t (:background ,gruber-darker-bg+4))))
+ `(shadow ((t (:foreground ,gruber-darker-bg+4))))
+ `(minibuffer-prompt ((t (:foreground ,gruber-darker-niagara))))
+ `(region ((t (:background ,gruber-darker-bg+3 :foreground nil))))
+ `(secondary-selection ((t ,(list :background gruber-darker-bg+3
+ :foreground nil))))
+ `(trailing-whitespace ((t ,(list :foreground gruber-darker-black
+ :background gruber-darker-red))))
+ `(tooltip ((t ,(list :background gruber-darker-bg+4
+ :foreground gruber-darker-white))))
+
+ ;; Calendar
+ `(holiday-face ((t (:foreground ,gruber-darker-red))))
+
+ ;; Compilation
+ `(compilation-info ((t ,(list :foreground gruber-darker-green
+ :inherit 'unspecified))))
+ `(compilation-warning ((t ,(list :foreground gruber-darker-brown
+ :bold t
+ :inherit 'unspecified))))
+ `(compilation-error ((t (:foreground ,gruber-darker-red+1))))
+ `(compilation-mode-line-fail ((t ,(list :foreground gruber-darker-red
+ :weight 'bold
+ :inherit 'unspecified))))
+ `(compilation-mode-line-exit ((t ,(list :foreground gruber-darker-green
+ :weight 'bold
+ :inherit 'unspecified))))
+
+ ;; Custom
+ `(custom-state ((t (:foreground ,gruber-darker-green))))
+
+ ;; Diff
+ `(diff-removed ((t ,(list :foreground gruber-darker-red+1
+ :background nil))))
+ `(diff-added ((t ,(list :foreground gruber-darker-green
+ :background nil))))
+
+ ;; Dired
+ `(dired-directory ((t (:foreground ,gruber-darker-niagara :weight bold))))
+ `(dired-ignored ((t ,(list :foreground gruber-darker-quartz
+ :inherit 'unspecified))))
+
+ ;; Ebrowse
+ `(ebrowse-root-class ((t (:foreground ,gruber-darker-niagara :weight bold))))
+ `(ebrowse-progress ((t (:background ,gruber-darker-niagara))))
+
+ ;; Egg
+ `(egg-branch ((t (:foreground ,gruber-darker-yellow))))
+ `(egg-branch-mono ((t (:foreground ,gruber-darker-yellow))))
+ `(egg-diff-add ((t (:foreground ,gruber-darker-green))))
+ `(egg-diff-del ((t (:foreground ,gruber-darker-red))))
+ `(egg-diff-file-header ((t (:foreground ,gruber-darker-wisteria))))
+ `(egg-help-header-1 ((t (:foreground ,gruber-darker-yellow))))
+ `(egg-help-header-2 ((t (:foreground ,gruber-darker-niagara))))
+ `(egg-log-HEAD-name ((t (:box (:color ,gruber-darker-fg)))))
+ `(egg-reflog-mono ((t (:foreground ,gruber-darker-niagara-1))))
+ `(egg-section-title ((t (:foreground ,gruber-darker-yellow))))
+ `(egg-text-base ((t (:foreground ,gruber-darker-fg))))
+ `(egg-term ((t (:foreground ,gruber-darker-yellow))))
+
+ ;; ERC
+ `(erc-notice-face ((t (:foreground ,gruber-darker-wisteria))))
+ `(erc-timestamp-face ((t (:foreground ,gruber-darker-green))))
+ `(erc-input-face ((t (:foreground ,gruber-darker-red+1))))
+ `(erc-my-nick-face ((t (:foreground ,gruber-darker-red+1))))
+
+ ;; EShell
+ `(eshell-ls-backup ((t (:foreground ,gruber-darker-quartz))))
+ `(eshell-ls-directory ((t (:foreground ,gruber-darker-niagara))))
+ `(eshell-ls-executable ((t (:foreground ,gruber-darker-green))))
+ `(eshell-ls-symlink ((t (:foreground ,gruber-darker-yellow))))
+
+ ;; Font Lock
+ `(font-lock-builtin-face ((t (:foreground ,gruber-darker-yellow))))
+ `(font-lock-comment-face ((t (:foreground ,gruber-darker-brown))))
+ `(font-lock-comment-delimiter-face ((t (:foreground ,gruber-darker-brown))))
+ `(font-lock-constant-face ((t (:foreground ,gruber-darker-quartz))))
+ `(font-lock-doc-face ((t (:foreground ,gruber-darker-green))))
+ `(font-lock-doc-string-face ((t (:foreground ,gruber-darker-green))))
+ `(font-lock-function-name-face ((t (:foreground ,gruber-darker-niagara))))
+ `(font-lock-keyword-face ((t (:foreground ,gruber-darker-yellow :bold t))))
+ `(font-lock-preprocessor-face ((t (:foreground ,gruber-darker-quartz))))
+ `(font-lock-reference-face ((t (:foreground ,gruber-darker-quartz))))
+ `(font-lock-string-face ((t (:foreground ,gruber-darker-green))))
+ `(font-lock-type-face ((t (:foreground ,gruber-darker-quartz))))
+ `(font-lock-variable-name-face ((t (:foreground ,gruber-darker-fg+1))))
+ `(font-lock-warning-face ((t (:foreground ,gruber-darker-red))))
+
+ ;; Flymake
+ `(flymake-errline
+ ((((supports :underline (:style wave)))
+ (:underline (:style wave :color ,gruber-darker-red)
+ :foreground unspecified
+ :background unspecified
+ :inherit unspecified))
+ (t (:foreground ,gruber-darker-red :weight bold :underline t))))
+ `(flymake-warnline
+ ((((supports :underline (:style wave)))
+ (:underline (:style wave :color ,gruber-darker-yellow)
+ :foreground unspecified
+ :background unspecified
+ :inherit unspecified))
+ (t (:forground ,gruber-darker-yellow :weight bold :underline t))))
+ `(flymake-infoline
+ ((((supports :underline (:style wave)))
+ (:underline (:style wave :color ,gruber-darker-green)
+ :foreground unspecified
+ :background unspecified
+ :inherit unspecified))
+ (t (:forground ,gruber-darker-green :weight bold :underline t))))
+
+ ;; Flyspell
+ `(flyspell-incorrect
+ ((((supports :underline (:style wave)))
+ (:underline (:style wave :color ,gruber-darker-red) :inherit unspecified))
+ (t (:foreground ,gruber-darker-red :weight bold :underline t))))
+ `(flyspell-duplicate
+ ((((supports :underline (:style wave)))
+ (:underline (:style wave :color ,gruber-darker-yellow) :inherit unspecified))
+ (t (:foreground ,gruber-darker-yellow :weight bold :underline t))))
+
+ ;; Helm
+ `(helm-candidate-number ((t ,(list :background gruber-darker-bg+2
+ :foreground gruber-darker-yellow
+ :bold t))))
+ `(helm-ff-directory ((t ,(list :foreground gruber-darker-niagara
+ :background gruber-darker-bg
+ :bold t))))
+ `(helm-ff-executable ((t (:foreground ,gruber-darker-green))))
+ `(helm-ff-file ((t (:foreground ,gruber-darker-fg :inherit unspecified))))
+ `(helm-ff-invalid-symlink ((t ,(list :foreground gruber-darker-bg
+ :background gruber-darker-red))))
+ `(helm-ff-symlink ((t (:foreground ,gruber-darker-yellow :bold t))))
+ `(helm-selection-line ((t (:background ,gruber-darker-bg+1))))
+ `(helm-selection ((t (:background ,gruber-darker-bg+1 :underline nil))))
+ `(helm-source-header ((t ,(list :foreground gruber-darker-yellow
+ :background gruber-darker-bg
+ :box (list :line-width -1
+ :style 'released-button)))))
+
+ ;; Ido
+ `(ido-first-match ((t (:foreground ,gruber-darker-yellow :bold nil))))
+ `(ido-only-match ((t (:foreground ,gruber-darker-brown :weight bold))))
+ `(ido-subdir ((t (:foreground ,gruber-darker-niagara :weight bold))))
+
+ ;; Info
+ `(info-xref ((t (:foreground ,gruber-darker-niagara))))
+ `(info-visited ((t (:foreground ,gruber-darker-wisteria))))
+
+ ;; Jabber
+ `(jabber-chat-prompt-foreign ((t ,(list :foreground gruber-darker-quartz
+ :bold nil))))
+ `(jabber-chat-prompt-local ((t (:foreground ,gruber-darker-yellow))))
+ `(jabber-chat-prompt-system ((t (:foreground ,gruber-darker-green))))
+ `(jabber-rare-time-face ((t (:foreground ,gruber-darker-green))))
+ `(jabber-roster-user-online ((t (:foreground ,gruber-darker-green))))
+ `(jabber-activity-face ((t (:foreground ,gruber-darker-red))))
+ `(jabber-activity-personal-face ((t (:foreground ,gruber-darker-yellow :bold t))))
+
+ ;; Line Highlighting
+ `(highlight ((t (:background ,gruber-darker-bg+1 :foreground nil))))
+ `(highlight-current-line-face ((t ,(list :background gruber-darker-bg+1
+ :foreground nil))))
+
+ ;; line numbers
+ `(line-number ((t (:inherit default :foreground ,gruber-darker-bg+4))))
+ `(line-number-current-line ((t (:inherit line-number :foreground ,gruber-darker-yellow))))
+
+ ;; Linum
+ `(linum ((t `(list :foreground gruber-darker-quartz
+ :background gruber-darker-bg))))
+
+ ;; Magit
+ `(magit-branch ((t (:foreground ,gruber-darker-niagara))))
+ `(magit-diff-hunk-header ((t (:background ,gruber-darker-bg+2))))
+ `(magit-diff-file-header ((t (:background ,gruber-darker-bg+4))))
+ `(magit-log-sha1 ((t (:foreground ,gruber-darker-red+1))))
+ `(magit-log-author ((t (:foreground ,gruber-darker-brown))))
+ `(magit-log-head-label-remote ((t ,(list :foreground gruber-darker-green
+ :background gruber-darker-bg+1))))
+ `(magit-log-head-label-local ((t ,(list :foreground gruber-darker-niagara
+ :background gruber-darker-bg+1))))
+ `(magit-log-head-label-tags ((t ,(list :foreground gruber-darker-yellow
+ :background gruber-darker-bg+1))))
+ `(magit-log-head-label-head ((t ,(list :foreground gruber-darker-fg
+ :background gruber-darker-bg+1))))
+ `(magit-item-highlight ((t (:background ,gruber-darker-bg+1))))
+ `(magit-tag ((t ,(list :foreground gruber-darker-yellow
+ :background gruber-darker-bg))))
+ `(magit-blame-heading ((t ,(list :background gruber-darker-bg+1
+ :foreground gruber-darker-fg))))
+
+ ;; Message
+ `(message-header-name ((t (:foreground ,gruber-darker-green))))
+
+ ;; Mode Line
+ `(mode-line ((t ,(list :background gruber-darker-bg+1
+ :foreground gruber-darker-white))))
+ `(mode-line-buffer-id ((t ,(list :background gruber-darker-bg+1
+ :foreground gruber-darker-white))))
+ `(mode-line-inactive ((t ,(list :background gruber-darker-bg+1
+ :foreground gruber-darker-quartz))))
+
+ ;; Neo Dir
+ `(neo-dir-link-face ((t (:foreground ,gruber-darker-niagara))))
+
+ ;; Org Mode
+ `(org-agenda-structure ((t (:foreground ,gruber-darker-niagara))))
+ `(org-column ((t (:background ,gruber-darker-bg-1))))
+ `(org-column-title ((t (:background ,gruber-darker-bg-1 :underline t :weight bold))))
+ `(org-done ((t (:foreground ,gruber-darker-green))))
+ `(org-todo ((t (:foreground ,gruber-darker-red-1))))
+ `(org-upcoming-deadline ((t (:foreground ,gruber-darker-yellow))))
+
+ ;; Search
+ `(isearch ((t ,(list :foreground gruber-darker-black
+ :background gruber-darker-fg+2))))
+ `(isearch-fail ((t ,(list :foreground gruber-darker-black
+ :background gruber-darker-red))))
+ `(isearch-lazy-highlight-face ((t ,(list
+ :foreground gruber-darker-fg+1
+ :background gruber-darker-niagara-1))))
+
+ ;; Sh
+ `(sh-quoted-exec ((t (:foreground ,gruber-darker-red+1))))
+
+ ;; Show Paren
+ `(show-paren-match-face ((t (:background ,gruber-darker-bg+4))))
+ `(show-paren-mismatch-face ((t (:background ,gruber-darker-red-1))))
+
+ ;; Slime
+ `(slime-repl-inputed-output-face ((t (:foreground ,gruber-darker-red))))
+
+ ;; Tuareg
+ `(tuareg-font-lock-governing-face ((t (:foreground ,gruber-darker-yellow))))
+
+ ;; Speedbar
+ `(speedbar-directory-face ((t ,(list :foreground gruber-darker-niagara
+ :weight 'bold))))
+ `(speedbar-file-face ((t (:foreground ,gruber-darker-fg))))
+ `(speedbar-highlight-face ((t (:background ,gruber-darker-bg+1))))
+ `(speedbar-selected-face ((t (:foreground ,gruber-darker-red))))
+ `(speedbar-tag-face ((t (:foreground ,gruber-darker-yellow))))
+
+ ;; Which Function
+ `(which-func ((t (:foreground ,gruber-darker-wisteria))))
+
+ ;; Whitespace
+ `(whitespace-space ((t ,(list :background gruber-darker-bg
+ :foreground gruber-darker-bg+1))))
+ `(whitespace-tab ((t ,(list :background gruber-darker-bg
+ :foreground gruber-darker-bg+1))))
+ `(whitespace-hspace ((t ,(list :background gruber-darker-bg
+ :foreground gruber-darker-bg+2))))
+ `(whitespace-line ((t ,(list :background gruber-darker-bg+2
+ :foreground gruber-darker-red+1))))
+ `(whitespace-newline ((t ,(list :background gruber-darker-bg
+ :foreground gruber-darker-bg+2))))
+ `(whitespace-trailing ((t ,(list :background gruber-darker-red
+ :foreground gruber-darker-red))))
+ `(whitespace-empty ((t ,(list :background gruber-darker-yellow
+ :foreground gruber-darker-yellow))))
+ `(whitespace-indentation ((t ,(list :background gruber-darker-yellow
+ :foreground gruber-darker-red))))
+ `(whitespace-space-after-tab ((t ,(list :background gruber-darker-yellow
+ :foreground gruber-darker-yellow))))
+ `(whitespace-space-before-tab ((t ,(list :background gruber-darker-brown
+ :foreground gruber-darker-brown))))
+
+ ;;;;; company-mode
+ `(company-tooltip ((t (:foreground ,gruber-darker-fg :background ,gruber-darker-bg+1))))
+ `(company-tooltip-annotation ((t (:foreground ,gruber-darker-brown :background ,gruber-darker-bg+1))))
+ `(company-tooltip-annotation-selection ((t (:foreground ,gruber-darker-brown :background ,gruber-darker-bg-1))))
+ `(company-tooltip-selection ((t (:foreground ,gruber-darker-fg :background ,gruber-darker-bg-1))))
+ `(company-tooltip-mouse ((t (:background ,gruber-darker-bg-1))))
+ `(company-tooltip-common ((t (:foreground ,gruber-darker-green))))
+ `(company-tooltip-common-selection ((t (:foreground ,gruber-darker-green))))
+ `(company-scrollbar-fg ((t (:background ,gruber-darker-bg-1))))
+ `(company-scrollbar-bg ((t (:background ,gruber-darker-bg+2))))
+ `(company-preview ((t (:background ,gruber-darker-green))))
+ `(company-preview-common ((t (:foreground ,gruber-darker-green :background ,gruber-darker-bg-1))))
+
+ ;;;;; Proof General
+ `(proof-locked-face ((t (:background ,gruber-darker-niagara-2))))
+ ))
+
+;;;###autoload
+(when load-file-name
+ (add-to-list 'custom-theme-load-path
+ (file-name-as-directory (file-name-directory load-file-name))))
+
+(provide-theme 'gruber-darker)
+
+;; Local Variables:
+;; no-byte-compile: t
+;; indent-tabs-mode: nil
+;; eval: (when (fboundp 'rainbow-mode) (rainbow-mode +1))
+;; End:
+
+;;; gruber-darker-theme.el ends here.
diff --git a/elpa/xelb-0.20.signed b/elpa/xelb-0.20.signed
new file mode 100644
index 0000000..0ab2976
--- /dev/null
+++ b/elpa/xelb-0.20.signed
@@ -0,0 +1 @@
+Good signature from 645357D2883A0966 GNU ELPA Signing Agent (2023) <elpasign@elpa.gnu.org> (trust undefined) created at 2024-07-08T21:05:03+0000 using EDDSA \ No newline at end of file
diff --git a/elpa/xelb-0.20/.elpaignore b/elpa/xelb-0.20/.elpaignore
new file mode 100644
index 0000000..f0f644e
--- /dev/null
+++ b/elpa/xelb-0.20/.elpaignore
@@ -0,0 +1,2 @@
+LICENSE
+README.md
diff --git a/elpa/xelb-0.20/Makefile b/elpa/xelb-0.20/Makefile
new file mode 100644
index 0000000..2d56356
--- /dev/null
+++ b/elpa/xelb-0.20/Makefile
@@ -0,0 +1,30 @@
+PROTO_PATH := /usr/share/xcb
+
+EXTENSIONS := bigreq composite damage dbe dpms dri2 dri3 ge glx present randr \
+record render res screensaver shape shm sync xc_misc xevie xf86dri \
+xf86vidmode xfixes xinerama xinput xkb xprint xselinux xtest xvmc xv
+
+EXT_LIBS = $(addprefix xcb-,$(addsuffix .el,$(EXTENSIONS)))
+LIBS = xcb-xproto.el $(EXT_LIBS)
+
+all: clean $(LIBS)
+
+xcb-%.el: $(PROTO_PATH)/%.xml
+ @echo -n "\n"Generating $@...
+ @./xelb-gen $< > $@
+
+$(EXT_LIBS): xcb-xproto.el
+
+xcb-composite.el: xcb-xfixes.el
+xcb-damage.el: xcb-xfixes.el
+xcb-present.el: xcb-randr.el xcb-xfixes.el xcb-sync.el
+xcb-randr.el: xcb-render.el
+xcb-xfixes.el: xcb-render.el xcb-shape.el
+xcb-xinput.el: xcb-xfixes.el
+xcb-xvmc.el: xcb-xv.el
+xcb-xv.el: xcb-shm.el
+
+.PHONY: clean
+
+clean:
+ @rm -vf $(LIBS)
diff --git a/elpa/xelb-0.20/xcb-bigreq.el b/elpa/xelb-0.20/xcb-bigreq.el
new file mode 100644
index 0000000..e263413
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-bigreq.el
@@ -0,0 +1,48 @@
+;;; xcb-bigreq.el --- X11 BigRequests extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'bigreq.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:bigreq:-extension-xname "BIG-REQUESTS")
+(defconst xcb:bigreq:-extension-name "BigRequests")
+(defconst xcb:bigreq:-major-version 0)
+(defconst xcb:bigreq:-minor-version 0)
+
+(defclass xcb:bigreq:Enable
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)))
+(defclass xcb:bigreq:Enable~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (maximum-request-length :initarg :maximum-request-length :type xcb:CARD32)))
+
+
+
+(provide 'xcb-bigreq)
+
+;;; xcb-bigreq.el ends here
diff --git a/elpa/xelb-0.20/xcb-bigreq.elc b/elpa/xelb-0.20/xcb-bigreq.elc
new file mode 100644
index 0000000..4963805
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-bigreq.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-composite.el b/elpa/xelb-0.20/xcb-composite.el
new file mode 100644
index 0000000..66d30f1
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-composite.el
@@ -0,0 +1,116 @@
+;;; xcb-composite.el --- X11 Composite extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'composite.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:composite:-extension-xname "Composite")
+(defconst xcb:composite:-extension-name "Composite")
+(defconst xcb:composite:-major-version 0)
+(defconst xcb:composite:-minor-version 4)
+
+(require 'xcb-xproto)
+
+(require 'xcb-xfixes)
+
+(defconst xcb:composite:Redirect:Automatic 0)
+(defconst xcb:composite:Redirect:Manual 1)
+
+(defclass xcb:composite:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD32)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD32)))
+(defclass xcb:composite:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:composite:RedirectWindow
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (update :initarg :update :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:composite:RedirectSubwindows
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (update :initarg :update :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:composite:UnredirectWindow
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (update :initarg :update :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:composite:UnredirectSubwindows
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (update :initarg :update :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:composite:CreateRegionFromBorderClip
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:composite:NameWindowPixmap
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)))
+
+(defclass xcb:composite:GetOverlayWindow
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:composite:GetOverlayWindow~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (overlay-win :initarg :overlay-win :type xcb:WINDOW)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:composite:ReleaseOverlayWindow
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+
+
+
+(provide 'xcb-composite)
+
+;;; xcb-composite.el ends here
diff --git a/elpa/xelb-0.20/xcb-composite.elc b/elpa/xelb-0.20/xcb-composite.elc
new file mode 100644
index 0000000..09eab9b
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-composite.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-cursor.el b/elpa/xelb-0.20/xcb-cursor.el
new file mode 100644
index 0000000..f0a3243
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-cursor.el
@@ -0,0 +1,432 @@
+;;; xcb-cursor.el --- Port of Xcursor -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library is a port of Xcursor in Xlib, and roughly corresponds to the
+;; xcb/util-cursor project.
+
+;; Usage tips:
+;; + Do not forget to call `xcb:cursor:init' for _every_ connection using this
+;; library.
+;; + The only useful method in this library is `xcb:cursor:load-cursor', which
+;; loads a cursor by its name (e.g. "left_ptr"), in the following order:
+;; 1. themed cursor
+;; 2. inherited themed cursor
+;; 3. standard X cursor
+
+;; Todo:
+;; + Add legacy support for RENDER.
+;; + Cursor should be set per screen (only the first is used right now).
+;; + Move codes corresponding to xcb/util-renderutil or xcb/util-image
+;; elsewhere.
+
+;; References:
+;; + Xcursor(3).
+;; + xcb/util-cursor (git://anongit.freedesktop.org/xcb/util-cursor)
+;; + xcb/util-renderutil (git://anongit.freedesktop.org/xcb/util-renderutil)
+;; + xcb/util-image (git://anongit.freedesktop.org/xcb/util-image)
+
+;;; Code:
+
+(eval-when-compile (require 'cl-lib))
+(require 'xcb)
+(require 'xcb-render)
+
+;; FIXME: check if resource manager really works
+(cl-defmethod xcb:cursor:init ((obj xcb:connection))
+ "Initialize Xcursor for connection OBJ."
+ ;; Initialize resource manager
+ (let* ((root (slot-value (car (slot-value (xcb:get-setup obj) 'roots))
+ 'root))
+ (rm (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:GetProperty
+ :delete 0 :window root
+ :property xcb:Atom:RESOURCE_MANAGER
+ :type xcb:Atom:STRING
+ :long-offset 0
+ :long-length 16384))) ;FIXME: xcb/util-cursor
+ (rm (split-string
+ (decode-coding-string
+ (apply #'unibyte-string (append (slot-value rm 'value) nil))
+ 'iso-latin-1)
+ "\n"))
+ theme size dpi)
+ (dolist (i rm)
+ (pcase (replace-regexp-in-string "^\\(\\S-+\\)" "\\1" i)
+ ("Xcursor.theme"
+ (setq theme
+ (replace-regexp-in-string "^[^:]+:\\s-*\\(.+$\\)" "\\1" i)))
+ ("Xcursor.size"
+ (setq size
+ (string-to-number
+ (replace-regexp-in-string "^[^:]+:\\s-*\\(.+$\\)" "\\1" i))))
+ ("Xft.dpi"
+ (setq dpi
+ (string-to-number
+ (replace-regexp-in-string "^[^:]+:\\s-*\\(.+$\\)" "\\1" i))))))
+ ;; Get cursor size from XCURSOR_SIZE environment variable
+ (let ((default-size (getenv "XCURSOR_SIZE")))
+ (when default-size
+ (setq default-size (string-to-number default-size)))
+ (setq size (or default-size size)))
+ ;; Alternatives
+ (when (and (not size) dpi)
+ (setq size (/ (* dpi 16) 72))) ;FIXME: xcb/util-cursor
+ (unless size
+ (setq size
+ ;; FIXME: xcb/util-cursor
+ (/ (min (x-display-pixel-width) (x-display-pixel-height)) 48)))
+ ;; Save default values
+ (let ((plist (plist-get (slot-value obj 'extra-plist) 'cursor)))
+ (setq plist (plist-put plist 'theme theme)
+ plist (plist-put plist 'size size))
+ (setf (slot-value obj 'extra-plist)
+ (plist-put (slot-value obj 'extra-plist) 'cursor plist))))
+ ;; Initialize render extension
+ (if (= 0 (slot-value (xcb:get-extension-data obj 'xcb:render) 'present))
+ (error "[XELB:CURSOR] Render extension is not supported by this server")
+ (with-slots (minor-version)
+ (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:render:QueryVersion
+ :client-major-version 0 :client-minor-version 8))
+ (if (> 8 minor-version)
+ (error "[XELB:CURSOR] Render version 0.8 is not supported")
+ (let* ((formats
+ (slot-value (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:render:QueryPictFormats))
+ 'formats))
+ (format (catch 'break
+ (dolist (i formats)
+ (with-slots (type depth direct) i
+ (with-slots (red-shift red-mask
+ green-shift green-mask
+ blue-shift blue-mask
+ alpha-shift alpha-mask)
+ direct
+ ;; FIXME: xcb/util-renderutil
+ (when (and (= type xcb:render:PictType:Direct)
+ (= depth 32)
+ (= red-shift 16) (= red-mask #xFF)
+ (= green-shift 8) (= green-mask #xFF)
+ (= blue-shift 0) (= blue-mask #xFF)
+ (= alpha-shift 24)
+ (= alpha-mask #xFF))
+ (throw 'break i)))))))
+ (plist (plist-get (slot-value obj 'extra-plist) 'cursor)))
+ (setf (slot-value obj 'extra-plist)
+ (plist-put (slot-value obj 'extra-plist) 'cursor
+ (plist-put plist 'pict-format format))))))))
+
+(defsubst xcb:cursor:-get-path ()
+ "Return a list of cursor paths."
+ (let ((path (getenv "XCURSOR_PATH")))
+ (if path
+ (split-string path ":" t)
+ '("~/.icons"
+ "/usr/share/icons"
+ "/usr/share/pixmaps"
+ "/usr/X11R6/lib/X11/icons"))))
+
+(defun xcb:cursor:-get-theme-inherits (file)
+ "Return the inherited themes in a index.theme file FILE."
+ (let ((lines (with-temp-buffer
+ (insert-file-contents file)
+ (split-string (buffer-string) "\n" t))))
+ (catch 'break
+ (dolist (line lines)
+ (when (string-match "^Inherits\\s-*=\\s-*" line)
+ (throw 'break
+ (split-string (replace-regexp-in-string "^[^=]+=\\(.*\\)$"
+ "\\1" line)
+ "[;, \t\n]+" t)))))))
+
+(defsubst xcb:cursor:-shape->id (name)
+ "Return the standard Xcursor font for cursor named NAME."
+ ;; Standard X cursor fonts are defined in Emacs
+ (intern-soft (concat "x-pointer-" (replace-regexp-in-string "_" "-" name))))
+
+(defun xcb:cursor:-find-file (theme name &optional skip)
+ "Return the file for cursor named NAME in theme THEME, or nil if not found."
+ (catch 'return
+ ;; Skip searched themes
+ (when (memq theme skip)
+ (throw 'return nil))
+ ;; Give up when supplied "core" theme and a valid cursor name
+ (when (and (string= "core" theme) (xcb:cursor:-shape->id name))
+ (throw 'return nil))
+ (let ((path (xcb:cursor:-get-path))
+ file)
+ ;; 1. try THEME/cursors/NAME in each cursor path
+ (dolist (i path)
+ (setq file (concat i "/" theme "/cursors/" name))
+ (when (file-readable-p file)
+ (throw 'return file)))
+ ;; 2. try "Inherits=" key in "index.theme"
+ (dolist (i path)
+ (setq file (concat i "/" theme "/index.theme"))
+ (when (file-readable-p file)
+ (cl-pushnew theme skip)
+ ;; try all inherited themes
+ (dolist (j (xcb:cursor:-get-theme-inherits file))
+ (setq file (xcb:cursor:-find-file j name skip))
+ (when file
+ (throw 'return file))
+ (cl-pushnew j skip)))))
+ nil))
+
+(defconst xcb:cursor:-file-magic-lsb "Xcur"
+ "The magic number for little-endian Xcursor file.")
+(defconst xcb:cursor:-file-magic-msb "rucX"
+ "The magic number for big-endian Xcursor file.")
+
+(defclass xcb:cursor:-file-header (xcb:-struct)
+ ((magic :type xcb:CARD32)
+ (header :type xcb:CARD32)
+ (version :type xcb:CARD32)
+ (ntoc :type xcb:CARD32)) ;redundant, required for calculating TOC bytes
+ :documentation "Xcursor file header.")
+
+(defclass xcb:cursor:-file-header-toc (xcb:-struct)
+ ((ntoc :type xcb:CARD32) ;redundant slot
+ (toc :type xcb:-ignore)
+ (toc~ :initform '(name toc type xcb:cursor:-file-toc
+ size (xcb:-fieldref 'ntoc))
+ :type xcb:-list))
+ :documentation "The TOC field in Xcursor file header.")
+
+(defclass xcb:cursor:-file-toc (xcb:-struct)
+ ((type :type xcb:CARD32)
+ (subtype :type xcb:CARD32)
+ (position :type xcb:CARD32))
+ :documentation "Xcursor file TOC entry.")
+
+(defclass xcb:cursor:-file-chunk-header (xcb:-struct)
+ ((header :type xcb:CARD32)
+ (type :type xcb:CARD32)
+ (subtype :type xcb:CARD32)
+ (version :type xcb:CARD32)
+ (width :type xcb:CARD32) ;redundant, required for calculating image bytes
+ (height :type xcb:CARD32)) ;redundant, required for calculating image bytes
+ :documentation "Xcursor file chunk header.")
+
+(defconst xcb:cursor:-file-chunk-image-header 36
+ "Header value of image-type chunk in Xcursor file.")
+(defconst xcb:cursor:-file-chunk-image-type 4294770690.
+ "Type of image-type chunk in Xcursor file.")
+(defconst xcb:cursor:-file-chunk-image-version 1
+ "Version of image-type chunk in Xcursor file.")
+
+(defclass xcb:cursor:-file-chunk-image (xcb:-struct)
+ ((width :type xcb:CARD32) ;<= #x7FFF, redundant
+ (height :type xcb:CARD32) ;<= #x7FFF, redundant
+ (xhot :type xcb:CARD32) ;<= width
+ (yhot :type xcb:CARD32) ;<= height
+ (delay :type xcb:CARD32) ;in ms
+ (pixels :type xcb:-ignore)
+ (pixels~ :initform '(name pixels type xcb:CARD32
+ size (* (xcb:-fieldref 'width)
+ (xcb:-fieldref 'height)))
+ :type xcb:-list))
+ :documentation "Image-type chunk in Xcursor file.")
+
+(cl-defmethod xcb:cursor:-parse-file ((obj xcb:connection) path)
+ "Parse an Xcursor file named PATH."
+ (catch 'return
+ (let ((data (let ((coding-system-for-read 'binary))
+ (with-temp-buffer
+ (set-buffer-multibyte nil)
+ (insert-file-contents path) (buffer-string))))
+ xcb:lsb ;override global byte order
+ best-size chunks
+ magic file-header file-header-toc chunk-header chunk)
+ ;; Determine byte order
+ (setq magic (substring data 0 4))
+ (if (string= xcb:cursor:-file-magic-lsb magic)
+ (setq xcb:lsb t) ;LSB first
+ (if (string= xcb:cursor:-file-magic-msb magic)
+ (setq xcb:lsb nil) ;MSB first
+ (throw 'return nil)))
+ (setq file-header (make-instance 'xcb:cursor:-file-header))
+ ;;
+ (xcb:unmarshal file-header (substring data 0 16))
+ ;; FIXME: checks
+ (setq file-header-toc (make-instance 'xcb:cursor:-file-header-toc))
+ (xcb:unmarshal file-header-toc
+ (substring data 12 (+ 16 (* 12 (slot-value file-header
+ 'ntoc)))))
+ (with-slots (toc) file-header-toc
+ (let ((target (plist-get
+ (plist-get (slot-value obj 'extra-plist) 'cursor)
+ 'size)))
+ (catch 'break
+ (dolist (i toc)
+ (with-slots (type subtype) i
+ (when (= type xcb:cursor:-file-chunk-image-type)
+ (when (= target subtype)
+ (setq best-size target)
+ (throw 'break nil))
+ (when (or (not best-size)
+ (> (abs (- target best-size))
+ (abs (- target subtype))))
+ (setq best-size subtype)))))))
+ ;; Collect chunks fitting this size
+ (setq chunk-header (make-instance 'xcb:cursor:-file-chunk-header))
+ (dolist (i toc)
+ (with-slots (type subtype position) i
+ (when (and (= type xcb:cursor:-file-chunk-image-type)
+ (= subtype best-size))
+ (xcb:unmarshal chunk-header (substring data position
+ (+ position 24)))
+ ;; Validate the header of this chunk
+ (with-slots (header type subtype version) chunk-header
+ (when (or (/= header xcb:cursor:-file-chunk-image-header)
+ (/= type xcb:cursor:-file-chunk-image-type)
+ (/= subtype best-size)
+ (/= version xcb:cursor:-file-chunk-image-version))
+ (throw 'return nil)))
+ ;; Parse this chunk
+ (setq chunk (make-instance 'xcb:cursor:-file-chunk-image))
+ (xcb:unmarshal chunk (substring data (+ position 16)
+ (+ position 36
+ (* 4
+ (slot-value chunk-header
+ 'width)
+ (slot-value chunk-header
+ 'height)))))
+ (setq chunks (nconc chunks (list chunk))))))
+ (list xcb:lsb chunks)))))
+
+(cl-defmethod xcb:cursor:-load-cursor ((obj xcb:connection) file)
+ "Load a cursor file FILE."
+ (let* ((images (xcb:cursor:-parse-file obj file))
+ (lsb (car images))
+ (images (cadr images))
+ (root (slot-value (car (slot-value (xcb:get-setup obj) 'roots))
+ 'root))
+ (picture (xcb:generate-id obj))
+ (pict-format (slot-value
+ (plist-get
+ (plist-get (slot-value obj 'extra-plist) 'cursor)
+ 'pict-format)
+ 'id))
+ pixmap gc cursors cursor last-width last-height)
+ (dolist (image images)
+ (with-slots (width height xhot yhot delay pixels) image
+ (when (or (not pixmap) (/= last-width width) (/= last-height height))
+ (if pixmap
+ (progn (xcb:+request obj (make-instance 'xcb:FreePixmap
+ :pixmap pixmap))
+ (xcb:+request obj (make-instance 'xcb:FreeGC :gc gc)))
+ (setq pixmap (xcb:generate-id obj)
+ gc (xcb:generate-id obj)))
+ (xcb:+request obj (make-instance 'xcb:CreatePixmap
+ :depth 32 :pid pixmap :drawable root
+ :width width :height height))
+ (xcb:+request obj (make-instance 'xcb:CreateGC
+ :cid gc :drawable pixmap
+ :value-mask 0))
+ (setq last-width width
+ last-height height))
+ (xcb:+request obj (make-instance 'xcb:PutImage
+ :format xcb:ImageFormat:ZPixmap
+ :drawable pixmap
+ :gc gc
+ :width width
+ :height height
+ :dst-x 0
+ :dst-y 0
+ :left-pad 0
+ :depth 32
+ :data (with-temp-buffer
+ (set-buffer-multibyte nil)
+ (mapconcat
+ (if lsb #'xcb:-pack-u4-lsb
+ #'xcb:-pack-u4)
+ pixels []))))
+ (xcb:+request obj (make-instance 'xcb:render:CreatePicture
+ :pid picture
+ :drawable pixmap
+ :format pict-format
+ :value-mask 0))
+ (setq cursor (xcb:generate-id obj)
+ cursors (nconc cursors
+ (list (make-instance 'xcb:render:ANIMCURSORELT
+ :cursor cursor
+ :delay delay))))
+ (xcb:+request obj (make-instance 'xcb:render:CreateCursor
+ :cid cursor
+ :source picture
+ :x xhot :y yhot))
+ (xcb:+request obj (make-instance 'xcb:render:FreePicture
+ :picture picture))))
+ (xcb:+request obj (make-instance 'xcb:FreePixmap :pixmap pixmap))
+ (xcb:+request obj (make-instance 'xcb:FreeGC :gc gc))
+ (xcb:flush obj)
+ (if (= 1 (length cursors))
+ ;; Non-animated cursor
+ (slot-value (car cursors) 'cursor)
+ ;; Animated cursor
+ (setq cursor (xcb:generate-id obj))
+ (xcb:+request obj (make-instance 'xcb:render:CreateAnimCursor
+ :cid cursor
+ :cursors (vconcat cursors)))
+ (dolist (i cursors)
+ (xcb:+request obj (make-instance 'xcb:FreeCursor
+ :cursor (slot-value i 'cursor))))
+ (xcb:flush obj)
+ cursor)))
+
+(cl-defmethod xcb:cursor:load-cursor ((obj xcb:connection) name)
+ "Return a cursor whose name is NAME."
+ (let* ((theme (or (plist-get
+ (plist-get (slot-value obj 'extra-plist) 'cursor) 'theme)
+ "default"))
+ (file (xcb:cursor:-find-file theme name)))
+ (if file
+ (xcb:cursor:-load-cursor obj file)
+ ;; Fallback to standard X cursors
+ (let ((pointer (xcb:cursor:-shape->id name))
+ (cursor xcb:Cursor:None)
+ font)
+ (when (boundp pointer)
+ (setq pointer (symbol-value pointer)
+ font (xcb:generate-id obj)
+ cursor (xcb:generate-id obj))
+ (xcb:+request obj
+ (make-instance 'xcb:OpenFont
+ :fid font :name-len (length "cursor")
+ :name "cursor"))
+ (xcb:+request obj
+ (make-instance 'xcb:CreateGlyphCursor
+ :cid cursor :source-font font :mask-font font
+ :source-char pointer :mask-char (1+ pointer)
+ :fore-red 0 :fore-green 0 :fore-blue 0
+ :back-red #xFFFF :back-green #xFFFF
+ :back-blue #xFFFF))
+ (xcb:flush obj))
+ cursor))))
+
+
+
+(provide 'xcb-cursor)
+
+;;; xcb-cursor.el ends here
diff --git a/elpa/xelb-0.20/xcb-cursor.elc b/elpa/xelb-0.20/xcb-cursor.elc
new file mode 100644
index 0000000..1e4235d
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-cursor.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-damage.el b/elpa/xelb-0.20/xcb-damage.el
new file mode 100644
index 0000000..2ae0d87
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-damage.el
@@ -0,0 +1,112 @@
+;;; xcb-damage.el --- X11 Damage extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'damage.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:damage:-extension-xname "DAMAGE")
+(defconst xcb:damage:-extension-name "Damage")
+(defconst xcb:damage:-major-version 1)
+(defconst xcb:damage:-minor-version 1)
+
+(require 'xcb-xproto)
+
+(require 'xcb-xfixes)
+
+(xcb:deftypealias 'xcb:damage:DAMAGE 'xcb:-u4)
+
+(defconst xcb:damage:ReportLevel:RawRectangles 0)
+(defconst xcb:damage:ReportLevel:DeltaRectangles 1)
+(defconst xcb:damage:ReportLevel:BoundingBox 2)
+(defconst xcb:damage:ReportLevel:NonEmpty 3)
+
+(defclass xcb:damage:BadDamage
+ (xcb:-error)
+ ((~code :initform 0)))
+
+(defclass xcb:damage:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD32)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD32)))
+(defclass xcb:damage:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:damage:Create
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (damage :initarg :damage :type xcb:damage:DAMAGE)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (level :initarg :level :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:damage:Destroy
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (damage :initarg :damage :type xcb:damage:DAMAGE)))
+
+(defclass xcb:damage:Subtract
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (damage :initarg :damage :type xcb:damage:DAMAGE)
+ (repair :initarg :repair :type xcb:xfixes:REGION)
+ (parts :initarg :parts :type xcb:xfixes:REGION)))
+
+(defclass xcb:damage:Add
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (region :initarg :region :type xcb:xfixes:REGION)))
+
+(defclass xcb:damage:Notify
+ (xcb:-event)
+ ((~code :initform 0)
+ (level :initarg :level :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (damage :initarg :damage :type xcb:damage:DAMAGE)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (area :initarg :area :type xcb:RECTANGLE)
+ (geometry :initarg :geometry :type xcb:RECTANGLE)))
+
+(defconst xcb:damage:error-number-class-alist
+ '((0 . xcb:damage:BadDamage))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:damage:event-number-class-alist
+ '((0 . xcb:damage:Notify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-damage)
+
+;;; xcb-damage.el ends here
diff --git a/elpa/xelb-0.20/xcb-damage.elc b/elpa/xelb-0.20/xcb-damage.elc
new file mode 100644
index 0000000..380ee35
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-damage.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-dbe.el b/elpa/xelb-0.20/xcb-dbe.el
new file mode 100644
index 0000000..5e9168a
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-dbe.el
@@ -0,0 +1,162 @@
+;;; xcb-dbe.el --- X11 Dbe extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'dbe.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:dbe:-extension-xname "DOUBLE-BUFFER")
+(defconst xcb:dbe:-extension-name "Dbe")
+(defconst xcb:dbe:-major-version 1)
+(defconst xcb:dbe:-minor-version 0)
+
+(require 'xcb-xproto)
+
+(xcb:deftypealias 'xcb:dbe:BackBuffer 'xcb:DRAWABLE)
+
+(defconst xcb:dbe:SwapAction:Undefined 0)
+(defconst xcb:dbe:SwapAction:Background 1)
+(defconst xcb:dbe:SwapAction:Untouched 2)
+(defconst xcb:dbe:SwapAction:Copied 3)
+
+(defclass xcb:dbe:SwapInfo
+ (xcb:-struct)
+ ((window :initarg :window :type xcb:WINDOW)
+ (swap-action :initarg :swap-action :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:dbe:BufferAttributes
+ (xcb:-struct)
+ ((window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:dbe:VisualInfo
+ (xcb:-struct)
+ ((visual-id :initarg :visual-id :type xcb:VISUALID)
+ (depth :initarg :depth :type xcb:CARD8)
+ (perf-level :initarg :perf-level :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:dbe:VisualInfos
+ (xcb:-struct)
+ ((n-infos :initarg :n-infos :type xcb:CARD32)
+ (infos~ :initform
+ '(name infos type xcb:dbe:VisualInfo size
+ (xcb:-fieldref 'n-infos))
+ :type xcb:-list)
+ (infos :initarg :infos :type xcb:-ignore)))
+
+(defclass xcb:dbe:BadBuffer
+ (xcb:-error)
+ ((~code :initform 0)
+ (bad-buffer :initarg :bad-buffer :type xcb:dbe:BackBuffer)))
+
+(defclass xcb:dbe:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD8)
+ (minor-version :initarg :minor-version :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:dbe:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD8)
+ (minor-version :initarg :minor-version :type xcb:CARD8)
+ (pad~1 :initform 22 :type xcb:-pad)))
+
+(defclass xcb:dbe:AllocateBackBuffer
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (buffer :initarg :buffer :type xcb:dbe:BackBuffer)
+ (swap-action :initarg :swap-action :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:dbe:DeallocateBackBuffer
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (buffer :initarg :buffer :type xcb:dbe:BackBuffer)))
+
+(defclass xcb:dbe:SwapBuffers
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (n-actions :initarg :n-actions :type xcb:CARD32)
+ (actions~ :initform
+ '(name actions type xcb:dbe:SwapInfo size
+ (xcb:-fieldref 'n-actions))
+ :type xcb:-list)
+ (actions :initarg :actions :type xcb:-ignore)))
+
+(defclass xcb:dbe:BeginIdiom
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)))
+
+(defclass xcb:dbe:EndIdiom
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)))
+
+(defclass xcb:dbe:GetVisualInfo
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (n-drawables :initarg :n-drawables :type xcb:CARD32)
+ (drawables~ :initform
+ '(name drawables type xcb:DRAWABLE size
+ (xcb:-fieldref 'n-drawables))
+ :type xcb:-list)
+ (drawables :initarg :drawables :type xcb:-ignore)))
+(defclass xcb:dbe:GetVisualInfo~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (n-supported-visuals :initarg :n-supported-visuals :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (supported-visuals~ :initform
+ '(name supported-visuals type xcb:dbe:VisualInfos size
+ (xcb:-fieldref 'n-supported-visuals))
+ :type xcb:-list)
+ (supported-visuals :initarg :supported-visuals :type xcb:-ignore)))
+
+(defclass xcb:dbe:GetBackBufferAttributes
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (buffer :initarg :buffer :type xcb:dbe:BackBuffer)))
+(defclass xcb:dbe:GetBackBufferAttributes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (attributes :initarg :attributes :type xcb:dbe:BufferAttributes)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defconst xcb:dbe:error-number-class-alist
+ '((0 . xcb:dbe:BadBuffer))
+ "(error-number . error-class) alist.")
+
+
+
+(provide 'xcb-dbe)
+
+;;; xcb-dbe.el ends here
diff --git a/elpa/xelb-0.20/xcb-dbe.elc b/elpa/xelb-0.20/xcb-dbe.elc
new file mode 100644
index 0000000..56306c9
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-dbe.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-debug.el b/elpa/xelb-0.20/xcb-debug.el
new file mode 100644
index 0000000..e99661d
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-debug.el
@@ -0,0 +1,135 @@
+;;; xcb-debug.el --- Debugging helpers for XELB -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018-2024 Free Software Foundation, Inc.
+
+;; Author: Adrián Medraño Calvo <adrian@medranocalvo.com>
+
+;; 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 module collects functions that help in debugging XELB.
+
+;;; Code:
+
+(defvar xcb-debug:buffer "*XELB-DEBUG*" "Buffer to write debug messages to.")
+
+(defvar xcb-debug:backtrace-start-frame 5
+ "From which frame to start collecting backtraces.")
+
+(defvar xcb-debug:log-time-function #'xcb-debug:log-uptime
+ "Function used for generating timestamps in XELB debug logs.
+
+Here are some predefined candidates:
+`xcb-debug:log-uptime': Display the uptime of this Emacs instance.
+`xcb-debug:log-time': Display time of day.
+`nil': Disable timestamp.")
+
+(defun xcb-debug:log-uptime ()
+ "Add uptime to XELB debug logs."
+ (emacs-uptime "[%.2h:%.2m:%.2s] "))
+
+(defun xcb-debug:log-time ()
+ "Add time of day to XELB debug logs."
+ (format-time-string "[%T] "))
+
+(defun xcb-debug:-call-stack ()
+ "Return the current call stack frames."
+ (let (frames frame
+ ;; No need to acount for our setq, while, let, ...
+ (index xcb-debug:backtrace-start-frame))
+ (while (setq frame (backtrace-frame index))
+ (push frame frames)
+ (cl-incf index))
+ (cl-remove-if-not 'car frames)))
+
+(defmacro xcb-debug:compile-time-function-name ()
+ "Get the name of outermost definition at expansion time."
+ (let* ((frame (cl-find-if
+ (lambda (frame)
+ (ignore-errors
+ (let ((clause (car (cl-third frame))))
+ (or (equal clause 'defalias)
+ (equal clause 'cl-defmethod)))))
+ (reverse (xcb-debug:-call-stack))))
+ (defn (cl-third frame))
+ (deftype (car defn)))
+ (cl-case deftype
+ ((defalias) (symbol-name (cl-cadadr defn)))
+ ((cl-defmethod) (symbol-name (cadr defn)))
+ (t "<unknown function>"))))
+
+(defmacro xcb-debug:-with-debug-buffer (&rest forms)
+ "Evaluate FORMS making sure `xcb-debug:buffer' is correctly updated."
+ `(with-current-buffer (xcb-debug:-get-buffer)
+ (let (windows-eob)
+ ;; Note windows whose point is at EOB.
+ (dolist (w (get-buffer-window-list (current-buffer) t 'nomini))
+ (when (and (window-live-p w)
+ (= (window-point w) (point-max)))
+ (push w windows-eob)))
+ (save-excursion
+ (goto-char (point-max))
+ ,@forms)
+ ;; Restore point.
+ (dolist (w windows-eob)
+ (set-window-point w (point-max))))))
+
+(defun xcb-debug:message (format-string &rest objects)
+ "Print a message to `xcb-debug:buffer'.
+
+The FORMAT-STRING argument follows the speficies how to print each of
+the passed OBJECTS. See `format' for details."
+ (xcb-debug:-with-debug-buffer
+ (insert (apply #'format format-string objects))))
+
+(defmacro xcb-debug:backtrace ()
+ "Print a backtrace to the `xcb-debug:buffer'."
+ '(xcb-debug:-with-debug-buffer
+ (let ((standard-output (xcb-debug:-get-buffer)))
+ (backtrace))))
+
+(defmacro xcb-debug:backtrace-on-error (&rest forms)
+ "Evaluate FORMS. Printing a backtrace if an error is signaled."
+ `(let ((debug-on-error t)
+ (debugger (lambda (&rest _) (xcb-debug:backtrace))))
+ ,@forms))
+
+(defun xcb-debug:-get-buffer ()
+ "Get or create `xcb-debug:buffer'."
+ (let ((buffer (get-buffer xcb-debug:buffer)))
+ (unless buffer
+ (setq buffer (get-buffer-create xcb-debug:buffer))
+ (buffer-disable-undo buffer))
+ buffer))
+
+(defun xcb-debug:clear ()
+ "Clear the debug buffer."
+ (interactive)
+ (xcb-debug:-with-debug-buffer
+ (erase-buffer)))
+
+(defun xcb-debug:mark ()
+ "Insert a mark in the debug buffer."
+ (interactive)
+ (xcb-debug:-with-debug-buffer
+ (insert " \n")))
+
+
+
+(provide 'xcb-debug)
+
+;;; xcb-debug.el ends here
diff --git a/elpa/xelb-0.20/xcb-debug.elc b/elpa/xelb-0.20/xcb-debug.elc
new file mode 100644
index 0000000..1132c70
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-debug.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-dpms.el b/elpa/xelb-0.20/xcb-dpms.el
new file mode 100644
index 0000000..63b31f1
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-dpms.el
@@ -0,0 +1,134 @@
+;;; xcb-dpms.el --- X11 DPMS extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'dpms.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:dpms:-extension-xname "DPMS")
+(defconst xcb:dpms:-extension-name "DPMS")
+(defconst xcb:dpms:-major-version 1)
+(defconst xcb:dpms:-minor-version 2)
+
+(require 'xcb-xproto)
+
+(defclass xcb:dpms:GetVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD16)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD16)))
+(defclass xcb:dpms:GetVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (server-major-version :initarg :server-major-version :type xcb:CARD16)
+ (server-minor-version :initarg :server-minor-version :type xcb:CARD16)))
+
+(defclass xcb:dpms:Capable
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)))
+(defclass xcb:dpms:Capable~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (capable :initarg :capable :type xcb:BOOL)
+ (pad~1 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:dpms:GetTimeouts
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)))
+(defclass xcb:dpms:GetTimeouts~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (standby-timeout :initarg :standby-timeout :type xcb:CARD16)
+ (suspend-timeout :initarg :suspend-timeout :type xcb:CARD16)
+ (off-timeout :initarg :off-timeout :type xcb:CARD16)
+ (pad~1 :initform 18 :type xcb:-pad)))
+
+(defclass xcb:dpms:SetTimeouts
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (standby-timeout :initarg :standby-timeout :type xcb:CARD16)
+ (suspend-timeout :initarg :suspend-timeout :type xcb:CARD16)
+ (off-timeout :initarg :off-timeout :type xcb:CARD16)))
+
+(defclass xcb:dpms:Enable
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)))
+
+(defclass xcb:dpms:Disable
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)))
+
+(defconst xcb:dpms:DPMSMode:On 0)
+(defconst xcb:dpms:DPMSMode:Standby 1)
+(defconst xcb:dpms:DPMSMode:Suspend 2)
+(defconst xcb:dpms:DPMSMode:Off 3)
+
+(defclass xcb:dpms:ForceLevel
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (power-level :initarg :power-level :type xcb:CARD16)))
+
+(defclass xcb:dpms:Info
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)))
+(defclass xcb:dpms:Info~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (power-level :initarg :power-level :type xcb:CARD16)
+ (state :initarg :state :type xcb:BOOL)
+ (pad~1 :initform 21 :type xcb:-pad)))
+
+(defconst xcb:dpms:EventMask:InfoNotify 1)
+
+(defclass xcb:dpms:SelectInput
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (event-mask :initarg :event-mask :type xcb:CARD32)))
+
+(defclass xcb:dpms:InfoNotify
+ (xcb:-generic-event)
+ ((~evtype :initform 0)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (power-level :initarg :power-level :type xcb:CARD16)
+ (state :initarg :state :type xcb:BOOL)
+ (pad~1 :initform 21 :type xcb:-pad)))
+
+(defconst xcb:dpms:xge-number-class-alist
+ '((0 . xcb:dpms:InfoNotify))
+ "(xge-number . event-class) alist.")
+
+
+
+(provide 'xcb-dpms)
+
+;;; xcb-dpms.el ends here
diff --git a/elpa/xelb-0.20/xcb-dpms.elc b/elpa/xelb-0.20/xcb-dpms.elc
new file mode 100644
index 0000000..4bdfeaa
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-dpms.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-dri2.el b/elpa/xelb-0.20/xcb-dri2.el
new file mode 100644
index 0000000..040bb52
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-dri2.el
@@ -0,0 +1,322 @@
+;;; xcb-dri2.el --- X11 DRI2 extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'dri2.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:dri2:-extension-xname "DRI2")
+(defconst xcb:dri2:-extension-name "DRI2")
+(defconst xcb:dri2:-major-version 1)
+(defconst xcb:dri2:-minor-version 4)
+
+(require 'xcb-xproto)
+
+(defconst xcb:dri2:Attachment:BufferFrontLeft 0)
+(defconst xcb:dri2:Attachment:BufferBackLeft 1)
+(defconst xcb:dri2:Attachment:BufferFrontRight 2)
+(defconst xcb:dri2:Attachment:BufferBackRight 3)
+(defconst xcb:dri2:Attachment:BufferDepth 4)
+(defconst xcb:dri2:Attachment:BufferStencil 5)
+(defconst xcb:dri2:Attachment:BufferAccum 6)
+(defconst xcb:dri2:Attachment:BufferFakeFrontLeft 7)
+(defconst xcb:dri2:Attachment:BufferFakeFrontRight 8)
+(defconst xcb:dri2:Attachment:BufferDepthStencil 9)
+(defconst xcb:dri2:Attachment:BufferHiz 10)
+
+(defconst xcb:dri2:DriverType:DRI 0)
+(defconst xcb:dri2:DriverType:VDPAU 1)
+
+(defconst xcb:dri2:EventType:ExchangeComplete 1)
+(defconst xcb:dri2:EventType:BlitComplete 2)
+(defconst xcb:dri2:EventType:FlipComplete 3)
+
+(defclass xcb:dri2:DRI2Buffer
+ (xcb:-struct)
+ ((attachment :initarg :attachment :type xcb:CARD32)
+ (name :initarg :name :type xcb:CARD32)
+ (pitch :initarg :pitch :type xcb:CARD32)
+ (cpp :initarg :cpp :type xcb:CARD32)
+ (flags :initarg :flags :type xcb:CARD32)))
+
+(defclass xcb:dri2:AttachFormat
+ (xcb:-struct)
+ ((attachment :initarg :attachment :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD32)))
+
+(defclass xcb:dri2:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)))
+(defclass xcb:dri2:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)))
+
+(defclass xcb:dri2:Connect
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (driver-type :initarg :driver-type :type xcb:CARD32)))
+(defclass xcb:dri2:Connect~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (driver-name-length :initarg :driver-name-length :type xcb:CARD32)
+ (device-name-length :initarg :device-name-length :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)
+ (driver-name~ :initform
+ '(name driver-name type xcb:char size
+ (xcb:-fieldref 'driver-name-length))
+ :type xcb:-list)
+ (driver-name :initarg :driver-name :type xcb:-ignore)
+ (alignment-pad~ :initform
+ '(name alignment-pad type xcb:void size
+ (-
+ (logand
+ (+
+ (xcb:-fieldref 'driver-name-length)
+ 3)
+ (lognot 3))
+ (xcb:-fieldref 'driver-name-length)))
+ :type xcb:-list)
+ (alignment-pad :initarg :alignment-pad :type xcb:-ignore)
+ (device-name~ :initform
+ '(name device-name type xcb:char size
+ (xcb:-fieldref 'device-name-length))
+ :type xcb:-list)
+ (device-name :initarg :device-name :type xcb:-ignore)))
+
+(defclass xcb:dri2:Authenticate
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (magic :initarg :magic :type xcb:CARD32)))
+(defclass xcb:dri2:Authenticate~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (authenticated :initarg :authenticated :type xcb:CARD32)))
+
+(defclass xcb:dri2:CreateDrawable
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+
+(defclass xcb:dri2:DestroyDrawable
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+
+(defclass xcb:dri2:GetBuffers
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (count :initarg :count :type xcb:CARD32)
+ (attachments~ :initform
+ '(name attachments type xcb:CARD32 size nil)
+ :type xcb:-list)
+ (attachments :initarg :attachments :type xcb:-ignore)))
+(defclass xcb:dri2:GetBuffers~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD32)
+ (height :initarg :height :type xcb:CARD32)
+ (count :initarg :count :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (buffers~ :initform
+ '(name buffers type xcb:dri2:DRI2Buffer size
+ (xcb:-fieldref 'count))
+ :type xcb:-list)
+ (buffers :initarg :buffers :type xcb:-ignore)))
+
+(defclass xcb:dri2:CopyRegion
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (region :initarg :region :type xcb:CARD32)
+ (dest :initarg :dest :type xcb:CARD32)
+ (src :initarg :src :type xcb:CARD32)))
+(defclass xcb:dri2:CopyRegion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:dri2:GetBuffersWithFormat
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (count :initarg :count :type xcb:CARD32)
+ (attachments~ :initform
+ '(name attachments type xcb:dri2:AttachFormat size nil)
+ :type xcb:-list)
+ (attachments :initarg :attachments :type xcb:-ignore)))
+(defclass xcb:dri2:GetBuffersWithFormat~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD32)
+ (height :initarg :height :type xcb:CARD32)
+ (count :initarg :count :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (buffers~ :initform
+ '(name buffers type xcb:dri2:DRI2Buffer size
+ (xcb:-fieldref 'count))
+ :type xcb:-list)
+ (buffers :initarg :buffers :type xcb:-ignore)))
+
+(defclass xcb:dri2:SwapBuffers
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (target-msc-hi :initarg :target-msc-hi :type xcb:CARD32)
+ (target-msc-lo :initarg :target-msc-lo :type xcb:CARD32)
+ (divisor-hi :initarg :divisor-hi :type xcb:CARD32)
+ (divisor-lo :initarg :divisor-lo :type xcb:CARD32)
+ (remainder-hi :initarg :remainder-hi :type xcb:CARD32)
+ (remainder-lo :initarg :remainder-lo :type xcb:CARD32)))
+(defclass xcb:dri2:SwapBuffers~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (swap-hi :initarg :swap-hi :type xcb:CARD32)
+ (swap-lo :initarg :swap-lo :type xcb:CARD32)))
+
+(defclass xcb:dri2:GetMSC
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+(defclass xcb:dri2:GetMSC~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ust-hi :initarg :ust-hi :type xcb:CARD32)
+ (ust-lo :initarg :ust-lo :type xcb:CARD32)
+ (msc-hi :initarg :msc-hi :type xcb:CARD32)
+ (msc-lo :initarg :msc-lo :type xcb:CARD32)
+ (sbc-hi :initarg :sbc-hi :type xcb:CARD32)
+ (sbc-lo :initarg :sbc-lo :type xcb:CARD32)))
+
+(defclass xcb:dri2:WaitMSC
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (target-msc-hi :initarg :target-msc-hi :type xcb:CARD32)
+ (target-msc-lo :initarg :target-msc-lo :type xcb:CARD32)
+ (divisor-hi :initarg :divisor-hi :type xcb:CARD32)
+ (divisor-lo :initarg :divisor-lo :type xcb:CARD32)
+ (remainder-hi :initarg :remainder-hi :type xcb:CARD32)
+ (remainder-lo :initarg :remainder-lo :type xcb:CARD32)))
+(defclass xcb:dri2:WaitMSC~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ust-hi :initarg :ust-hi :type xcb:CARD32)
+ (ust-lo :initarg :ust-lo :type xcb:CARD32)
+ (msc-hi :initarg :msc-hi :type xcb:CARD32)
+ (msc-lo :initarg :msc-lo :type xcb:CARD32)
+ (sbc-hi :initarg :sbc-hi :type xcb:CARD32)
+ (sbc-lo :initarg :sbc-lo :type xcb:CARD32)))
+
+(defclass xcb:dri2:WaitSBC
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (target-sbc-hi :initarg :target-sbc-hi :type xcb:CARD32)
+ (target-sbc-lo :initarg :target-sbc-lo :type xcb:CARD32)))
+(defclass xcb:dri2:WaitSBC~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ust-hi :initarg :ust-hi :type xcb:CARD32)
+ (ust-lo :initarg :ust-lo :type xcb:CARD32)
+ (msc-hi :initarg :msc-hi :type xcb:CARD32)
+ (msc-lo :initarg :msc-lo :type xcb:CARD32)
+ (sbc-hi :initarg :sbc-hi :type xcb:CARD32)
+ (sbc-lo :initarg :sbc-lo :type xcb:CARD32)))
+
+(defclass xcb:dri2:SwapInterval
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (interval :initarg :interval :type xcb:CARD32)))
+
+(defclass xcb:dri2:GetParam
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (param :initarg :param :type xcb:CARD32)))
+(defclass xcb:dri2:GetParam~reply
+ (xcb:-reply)
+ ((is-param-recognized :initarg :is-param-recognized :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (value-hi :initarg :value-hi :type xcb:CARD32)
+ (value-lo :initarg :value-lo :type xcb:CARD32)))
+
+(defclass xcb:dri2:BufferSwapComplete
+ (xcb:-event)
+ ((~code :initform 0)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event-type :initarg :event-type :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (ust-hi :initarg :ust-hi :type xcb:CARD32)
+ (ust-lo :initarg :ust-lo :type xcb:CARD32)
+ (msc-hi :initarg :msc-hi :type xcb:CARD32)
+ (msc-lo :initarg :msc-lo :type xcb:CARD32)
+ (sbc :initarg :sbc :type xcb:CARD32)))
+
+(defclass xcb:dri2:InvalidateBuffers
+ (xcb:-event)
+ ((~code :initform 1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+
+(defconst xcb:dri2:event-number-class-alist
+ '((0 . xcb:dri2:BufferSwapComplete)
+ (1 . xcb:dri2:InvalidateBuffers))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-dri2)
+
+;;; xcb-dri2.el ends here
diff --git a/elpa/xelb-0.20/xcb-dri2.elc b/elpa/xelb-0.20/xcb-dri2.elc
new file mode 100644
index 0000000..9557ccb
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-dri2.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-dri3.el b/elpa/xelb-0.20/xcb-dri3.el
new file mode 100644
index 0000000..218820f
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-dri3.el
@@ -0,0 +1,228 @@
+;;; xcb-dri3.el --- X11 DRI3 extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'dri3.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:dri3:-extension-xname "DRI3")
+(defconst xcb:dri3:-extension-name "DRI3")
+(defconst xcb:dri3:-major-version 1)
+(defconst xcb:dri3:-minor-version 4)
+
+(require 'xcb-xproto)
+
+(xcb:deftypealias 'xcb:dri3:SYNCOBJ 'xcb:-u4)
+
+(defclass xcb:dri3:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)))
+(defclass xcb:dri3:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)))
+
+(defclass xcb:dri3:Open
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (provider :initarg :provider :type xcb:CARD32)))
+(defclass xcb:dri3:Open~reply
+ (xcb:-reply)
+ ((nfd :initarg :nfd :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (device-fd :type xcb:fd)
+ (pad~0 :initform 24 :type xcb:-pad)))
+
+(defclass xcb:dri3:PixmapFromBuffer
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (size :initarg :size :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (stride :initarg :stride :type xcb:CARD16)
+ (depth :initarg :depth :type xcb:CARD8)
+ (bpp :initarg :bpp :type xcb:CARD8)
+ (pixmap-fd :type xcb:fd)))
+
+(defclass xcb:dri3:BufferFromPixmap
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)))
+(defclass xcb:dri3:BufferFromPixmap~reply
+ (xcb:-reply)
+ ((nfd :initarg :nfd :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (size :initarg :size :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (stride :initarg :stride :type xcb:CARD16)
+ (depth :initarg :depth :type xcb:CARD8)
+ (bpp :initarg :bpp :type xcb:CARD8)
+ (pixmap-fd :type xcb:fd)
+ (pad~0 :initform 12 :type xcb:-pad)))
+
+(defclass xcb:dri3:FenceFromFD
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (fence :initarg :fence :type xcb:CARD32)
+ (initially-triggered :initarg :initially-triggered :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (fence-fd :type xcb:fd)))
+
+(defclass xcb:dri3:FDFromFence
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (fence :initarg :fence :type xcb:CARD32)))
+(defclass xcb:dri3:FDFromFence~reply
+ (xcb:-reply)
+ ((nfd :initarg :nfd :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (fence-fd :type xcb:fd)
+ (pad~0 :initform 24 :type xcb:-pad)))
+
+(defclass xcb:dri3:GetSupportedModifiers
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (window :initarg :window :type xcb:CARD32)
+ (depth :initarg :depth :type xcb:CARD8)
+ (bpp :initarg :bpp :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:dri3:GetSupportedModifiers~reply
+ (xcb:-reply)
+ ((pad~0 :initform 8 :type xcb:-pad-align)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (num-window-modifiers :initarg :num-window-modifiers :type xcb:CARD32)
+ (num-screen-modifiers :initarg :num-screen-modifiers :type xcb:CARD32)
+ (pad~2 :initform 16 :type xcb:-pad)
+ (window-modifiers~ :initform
+ '(name window-modifiers type xcb:CARD64 size
+ (xcb:-fieldref 'num-window-modifiers))
+ :type xcb:-list)
+ (window-modifiers :initarg :window-modifiers :type xcb:-ignore)
+ (screen-modifiers~ :initform
+ '(name screen-modifiers type xcb:CARD64 size
+ (xcb:-fieldref 'num-screen-modifiers))
+ :type xcb:-list)
+ (screen-modifiers :initarg :screen-modifiers :type xcb:-ignore)))
+
+(defclass xcb:dri3:PixmapFromBuffers
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (pad~0 :initform 8 :type xcb:-pad-align)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)
+ (window :initarg :window :type xcb:WINDOW)
+ (num-buffers :initarg :num-buffers :type xcb:CARD8)
+ (pad~1 :initform 3 :type xcb:-pad)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (stride0 :initarg :stride0 :type xcb:CARD32)
+ (offset0 :initarg :offset0 :type xcb:CARD32)
+ (stride1 :initarg :stride1 :type xcb:CARD32)
+ (offset1 :initarg :offset1 :type xcb:CARD32)
+ (stride2 :initarg :stride2 :type xcb:CARD32)
+ (offset2 :initarg :offset2 :type xcb:CARD32)
+ (stride3 :initarg :stride3 :type xcb:CARD32)
+ (offset3 :initarg :offset3 :type xcb:CARD32)
+ (depth :initarg :depth :type xcb:CARD8)
+ (bpp :initarg :bpp :type xcb:CARD8)
+ (pad~2 :initform 2 :type xcb:-pad)
+ (modifier :initarg :modifier :type xcb:CARD64)
+ (buffers~ :initform
+ '(name buffers type xcb:fd size
+ (xcb:-fieldref 'num-buffers))
+ :type xcb:-list)
+ (buffers :initarg :buffers :type xcb:-ignore)))
+
+(defclass xcb:dri3:BuffersFromPixmap
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)))
+(defclass xcb:dri3:BuffersFromPixmap~reply
+ (xcb:-reply)
+ ((pad~0 :initform 8 :type xcb:-pad-align)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (nfd :initarg :nfd :type xcb:CARD8)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (modifier :initarg :modifier :type xcb:CARD64)
+ (depth :initarg :depth :type xcb:CARD8)
+ (bpp :initarg :bpp :type xcb:CARD8)
+ (pad~2 :initform 6 :type xcb:-pad)
+ (strides~ :initform
+ '(name strides type xcb:CARD32 size
+ (xcb:-fieldref 'nfd))
+ :type xcb:-list)
+ (strides :initarg :strides :type xcb:-ignore)
+ (offsets~ :initform
+ '(name offsets type xcb:CARD32 size
+ (xcb:-fieldref 'nfd))
+ :type xcb:-list)
+ (offsets :initarg :offsets :type xcb:-ignore)
+ (buffers~ :initform
+ '(name buffers type xcb:fd size
+ (xcb:-fieldref 'nfd))
+ :type xcb:-list)
+ (buffers :initarg :buffers :type xcb:-ignore)))
+
+(defclass xcb:dri3:SetDRMDeviceInUse
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (drmMajor :initarg :drmMajor :type xcb:CARD32)
+ (drmMinor :initarg :drmMinor :type xcb:CARD32)))
+
+(defclass xcb:dri3:ImportSyncobj
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (syncobj :initarg :syncobj :type xcb:dri3:SYNCOBJ)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (syncobj-fd :type xcb:fd)))
+
+(defclass xcb:dri3:FreeSyncobj
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (syncobj :initarg :syncobj :type xcb:dri3:SYNCOBJ)))
+
+
+
+(provide 'xcb-dri3)
+
+;;; xcb-dri3.el ends here
diff --git a/elpa/xelb-0.20/xcb-dri3.elc b/elpa/xelb-0.20/xcb-dri3.elc
new file mode 100644
index 0000000..d145e13
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-dri3.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-ewmh.el b/elpa/xelb-0.20/xcb-ewmh.el
new file mode 100644
index 0000000..98bdd97
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-ewmh.el
@@ -0,0 +1,752 @@
+;;; xcb-ewmh.el --- Extended Window Manager Hints -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library implements EWMH the same way as xcb/util-wm.
+
+;; Usage tips:
+;; + Do not forget to call `xcb:ewmh:init' for _every_ connection using
+;; this library.
+;; + Use `xcb:ewmh:SendEvent' instead of `xcb:SendEvent' to send client
+;; messages defined in this library.
+;; + Initializing this library auto loads and initializes 'xcb-icccm'.
+
+;; References:
+;; + EWMH (http://standards.freedesktop.org/wm-spec/wm-spec-latest.html)
+;; + xcb/util-wm (git://anongit.freedesktop.org/xcb/util-wm)
+
+;;; Code:
+
+(require 'xcb)
+(require 'xcb-icccm)
+
+;;;; EWMH Atoms
+
+(eval-and-compile
+ (defconst xcb:ewmh:-atoms
+ '( ;; Root Window Properties (and Related Messages)
+ _NET_SUPPORTED
+ _NET_CLIENT_LIST
+ _NET_CLIENT_LIST_STACKING
+ _NET_NUMBER_OF_DESKTOPS
+ _NET_DESKTOP_GEOMETRY
+ _NET_DESKTOP_VIEWPORT
+ _NET_CURRENT_DESKTOP
+ _NET_DESKTOP_NAMES
+ _NET_ACTIVE_WINDOW
+ _NET_WORKAREA
+ _NET_SUPPORTING_WM_CHECK
+ _NET_VIRTUAL_ROOTS
+ _NET_DESKTOP_LAYOUT
+ _NET_SHOWING_DESKTOP
+ ;; Other Root Window Messages
+ _NET_CLOSE_WINDOW
+ _NET_MOVERESIZE_WINDOW
+ _NET_WM_MOVERESIZE
+ _NET_RESTACK_WINDOW
+ _NET_REQUEST_FRAME_EXTENTS
+ ;; Application Window Properties
+ _NET_WM_NAME
+ _NET_WM_VISIBLE_NAME
+ _NET_WM_ICON_NAME
+ _NET_WM_VISIBLE_ICON_NAME
+ _NET_WM_DESKTOP
+ _NET_WM_WINDOW_TYPE
+ _NET_WM_STATE
+ _NET_WM_ALLOWED_ACTIONS
+ _NET_WM_STRUT
+ _NET_WM_STRUT_PARTIAL
+ _NET_WM_ICON_GEOMETRY
+ _NET_WM_ICON
+ _NET_WM_PID
+ _NET_WM_HANDLED_ICONS
+ _NET_WM_USER_TIME
+ _NET_WM_USER_TIME_WINDOW
+ _NET_FRAME_EXTENTS
+ _NET_WM_OPAQUE_REGION
+ _NET_WM_BYPASS_COMPOSITOR
+ ;; Window Manager Protocols
+ _NET_WM_PING
+ _NET_WM_SYNC_REQUEST
+ _NET_WM_SYNC_REQUEST_COUNTER
+ _NET_WM_FULLSCREEN_MONITORS
+ ;; Other Properties
+ _NET_WM_FULL_PLACEMENT
+ _NET_WM_CM_S0 ;_NET_WM_CM_Sn (n = 1, 2, ...) are left out here.
+ ;; _NET_WM_WINDOW_TYPE hint
+ _NET_WM_WINDOW_TYPE_DESKTOP
+ _NET_WM_WINDOW_TYPE_DOCK
+ _NET_WM_WINDOW_TYPE_TOOLBAR
+ _NET_WM_WINDOW_TYPE_MENU
+ _NET_WM_WINDOW_TYPE_UTILITY
+ _NET_WM_WINDOW_TYPE_SPLASH
+ _NET_WM_WINDOW_TYPE_DIALOG
+ _NET_WM_WINDOW_TYPE_DROPDOWN_MENU
+ _NET_WM_WINDOW_TYPE_POPUP_MENU
+ _NET_WM_WINDOW_TYPE_TOOLTIP
+ _NET_WM_WINDOW_TYPE_NOTIFICATION
+ _NET_WM_WINDOW_TYPE_COMBO
+ _NET_WM_WINDOW_TYPE_DND
+ _NET_WM_WINDOW_TYPE_NORMAL
+ ;; _NET_WM_STATE hint
+ _NET_WM_STATE_MODAL
+ _NET_WM_STATE_STICKY
+ _NET_WM_STATE_MAXIMIZED_VERT
+ _NET_WM_STATE_MAXIMIZED_HORZ
+ _NET_WM_STATE_SHADED
+ _NET_WM_STATE_SKIP_TASKBAR
+ _NET_WM_STATE_SKIP_PAGER
+ _NET_WM_STATE_HIDDEN
+ _NET_WM_STATE_FULLSCREEN
+ _NET_WM_STATE_ABOVE
+ _NET_WM_STATE_BELOW
+ _NET_WM_STATE_DEMANDS_ATTENTION
+ _NET_WM_STATE_FOCUSED
+ ;; _NET_WM_ACTION hint
+ _NET_WM_ACTION_MOVE
+ _NET_WM_ACTION_RESIZE
+ _NET_WM_ACTION_MINIMIZE
+ _NET_WM_ACTION_SHADE
+ _NET_WM_ACTION_STICK
+ _NET_WM_ACTION_MAXIMIZE_HORZ
+ _NET_WM_ACTION_MAXIMIZE_VERT
+ _NET_WM_ACTION_FULLSCREEN
+ _NET_WM_ACTION_CHANGE_DESKTOP
+ _NET_WM_ACTION_CLOSE
+ _NET_WM_ACTION_ABOVE
+ _NET_WM_ACTION_BELOW)
+ "EWMH atoms.")
+
+ (dolist (atom xcb:ewmh:-atoms)
+ (eval `(defvar ,(intern (concat "xcb:Atom:" (symbol-name atom))) nil))))
+
+(cl-defmethod xcb:ewmh:init ((obj xcb:connection) &optional force)
+ "Initialize EWMH module.
+
+This method must be called before using any other method in this module.
+
+This method also initializes ICCCM module automatically."
+ (when (or force (not xcb:Atom:_NET_SUPPORTED))
+ (xcb:icccm:init obj) ;required
+ (let ((atoms xcb:ewmh:-atoms))
+ (dotimes (i (1- (x-display-screens)))
+ (push (intern (format "_NET_WM_CM_S%d" (1+ i))) atoms))
+ (xcb:icccm:intern-atoms obj atoms force))))
+
+;;;; Client message
+
+(defclass xcb:ewmh:SendEvent (xcb:SendEvent)
+ ((propagate :initform 0)
+ (event-mask :initform (logior xcb:EventMask:SubstructureNotify
+ xcb:EventMask:SubstructureRedirect)))
+ :documentation "A fork of `xcb:SendEvent' to send EWMH client message.
+
+Note that this only applies to \"sending a message to the root window\" in
+EWMH")
+
+(defclass xcb:ewmh:-ClientMessage (xcb:icccm:--ClientMessage xcb:ClientMessage)
+ ((format :initform 32)))
+
+;;;; Abstract classes for getting/changing (UTF-8) string properties
+
+(defclass xcb:ewmh:-GetProperty-utf8 (xcb:icccm:-GetProperty-text)
+ ((type :initform 'xcb:Atom:UTF8_STRING))
+ :documentation "Get an EWMH UTF-8 text property (request part).")
+(defclass xcb:ewmh:-GetProperty-utf8~reply (xcb:icccm:-GetProperty-text~reply)
+ nil
+ :documentation "Get an EWMH UTF-8 text property (reply part).")
+(defclass xcb:ewmh:-ChangeProperty-utf8 (xcb:icccm:-ChangeProperty-text)
+ ((type :initform 'xcb:Atom:UTF8_STRING))
+ :documentation "Change an EWMH UTF-8 text property.")
+
+;;;; Root Window Properties (and Related Messages)
+
+;; _NET_SUPPORTED
+(defclass xcb:ewmh:get-_NET_SUPPORTED (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_SUPPORTED)
+ (type :initform 'xcb:Atom:ATOM)))
+(defclass xcb:ewmh:get-_NET_SUPPORTED~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_SUPPORTED (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_SUPPORTED)
+ (type :initform 'xcb:Atom:ATOM)))
+
+;; _NET_CLIENT_LIST
+(defclass xcb:ewmh:get-_NET_CLIENT_LIST (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_CLIENT_LIST)
+ (type :initform 'xcb:Atom:WINDOW)))
+(defclass xcb:ewmh:get-_NET_CLIENT_LIST~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_CLIENT_LIST (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_CLIENT_LIST)
+ (type :initform 'xcb:Atom:WINDOW)))
+
+;; _NET_CLIENT_LIST_STACKING
+(defclass xcb:ewmh:get-_NET_CLIENT_LIST_STACKING (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_CLIENT_LIST_STACKING)
+ (type :initform 'xcb:Atom:WINDOW)))
+(defclass xcb:ewmh:get-_NET_CLIENT_LIST_STACKING~reply
+ (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_CLIENT_LIST_STACKING (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_CLIENT_LIST_STACKING)
+ (type :initform 'xcb:Atom:WINDOW)))
+
+;; _NET_NUMBER_OF_DESKTOPS
+(defclass xcb:ewmh:get-_NET_NUMBER_OF_DESKTOPS (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_NUMBER_OF_DESKTOPS)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_NUMBER_OF_DESKTOPS~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_NUMBER_OF_DESKTOPS
+ (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_NUMBER_OF_DESKTOPS)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_DESKTOP_GEOMETRY
+(defclass xcb:ewmh:-_NET_DESKTOP_GEOMETRY (xcb:--struct)
+ ((width :initarg :width :type xcb:-ignore)
+ (height :initarg :height :type xcb:-ignore)))
+;;
+(defclass xcb:ewmh:get-_NET_DESKTOP_GEOMETRY (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_NET_DESKTOP_GEOMETRY)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (long-length :initform 2)))
+(defclass xcb:ewmh:get-_NET_DESKTOP_GEOMETRY~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:ewmh:-_NET_DESKTOP_GEOMETRY)
+ nil)
+(defclass xcb:ewmh:set-_NET_DESKTOP_GEOMETRY
+ (xcb:icccm:-ChangeProperty-explicit xcb:ewmh:-_NET_DESKTOP_GEOMETRY)
+ ((property :initform 'xcb:Atom:_NET_DESKTOP_GEOMETRY)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:_NET_DESKTOP_GEOMETRY
+ (xcb:ewmh:-ClientMessage xcb:ewmh:-_NET_DESKTOP_GEOMETRY)
+ ((type :initform 'xcb:Atom:_NET_DESKTOP_GEOMETRY)))
+
+;; _NET_DESKTOP_VIEWPORT
+(defclass xcb:ewmh:get-_NET_DESKTOP_VIEWPORT (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_DESKTOP_VIEWPORT)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_DESKTOP_VIEWPORT~reply
+ (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_DESKTOP_VIEWPORT (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_DESKTOP_VIEWPORT)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:_NET_DESKTOP_VIEWPORT (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_DESKTOP_VIEWPORT)
+ (new-vx :initarg :new-vx :type xcb:CARD32)
+ (new-vy :initarg :new-vy :type xcb:CARD32)))
+
+;; _NET_CURRENT_DESKTOP
+(defclass xcb:ewmh:get-_NET_CURRENT_DESKTOP (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_CURRENT_DESKTOP)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_CURRENT_DESKTOP~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_CURRENT_DESKTOP (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_CURRENT_DESKTOP)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:_NET_CURRENT_DESKTOP (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_CURRENT_DESKTOP)
+ (new-index :initarg :new-index :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:CARD32)))
+
+;; _NET_DESKTOP_NAMES
+(defclass xcb:ewmh:get-_NET_DESKTOP_NAMES (xcb:ewmh:-GetProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_DESKTOP_NAMES)))
+(defclass xcb:ewmh:get-_NET_DESKTOP_NAMES~reply
+ (xcb:ewmh:-GetProperty-utf8~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_DESKTOP_NAMES (xcb:ewmh:-ChangeProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_DESKTOP_NAMES)))
+
+;; _NET_ACTIVE_WINDOW
+(defclass xcb:ewmh:get-_NET_ACTIVE_WINDOW (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_ACTIVE_WINDOW)
+ (type :initform 'xcb:Atom:WINDOW)))
+(defclass xcb:ewmh:get-_NET_ACTIVE_WINDOW~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_ACTIVE_WINDOW (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_ACTIVE_WINDOW)
+ (type :initform 'xcb:Atom:WINDOW)))
+(defclass xcb:ewmh:_NET_ACTIVE_WINDOW (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_ACTIVE_WINDOW)
+ (source-indication :initarg :source-indication :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:CARD32)
+ (current-active-window :initarg :current-active-window :type xcb:WINDOW)))
+
+;; _NET_WORKAREA
+(defclass xcb:ewmh:get-_NET_WORKAREA (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_WORKAREA)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_WORKAREA~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WORKAREA (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_WORKAREA)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_SUPPORTING_WM_CHECK
+(defclass xcb:ewmh:get-_NET_SUPPORTING_WM_CHECK (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_SUPPORTING_WM_CHECK)
+ (type :initform 'xcb:Atom:WINDOW)))
+(defclass xcb:ewmh:get-_NET_SUPPORTING_WM_CHECK~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_SUPPORTING_WM_CHECK
+ (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_SUPPORTING_WM_CHECK)
+ (type :initform 'xcb:Atom:WINDOW)))
+
+;; _NET_VIRTUAL_ROOTS
+(defclass xcb:ewmh:get-_NET_VIRTUAL_ROOTS (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_VIRTUAL_ROOTS)
+ (type :initform 'xcb:Atom:WINDOW)))
+(defclass xcb:ewmh:get-_NET_VIRTUAL_ROOTS~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_VIRTUAL_ROOTS (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_VIRTUAL_ROOTS)
+ (type :initform 'xcb:Atom:WINDOW)))
+
+;; _NET_DESKTOP_LAYOUT
+;; Orientations
+(defconst xcb:ewmh:_NET_WM_ORIENTATION_HORZ 0)
+(defconst xcb:ewmh:_NET_WM_ORIENTATION_VERT 1)
+;; Starting corners
+(defconst xcb:ewmh:_NET_WM_TOPLEFT 0)
+(defconst xcb:ewmh:_NET_WM_TOPRIGHT 1)
+(defconst xcb:ewmh:_NET_WM_BOTTOMRIGHT 2)
+(defconst xcb:ewmh:_NET_WM_BOTTOMLEFT 3)
+;;
+(defclass xcb:ewmh:-_NET_DESKTOP_LAYOUT (xcb:--struct)
+ ((orientation :initarg :orientation :type xcb:-ignore)
+ (columns :initarg :columns :type xcb:-ignore)
+ (rows :initarg :rows :type xcb:-ignore)
+ (starting-corner :initarg :starting-corner :type xcb:-ignore)))
+;;
+(defclass xcb:ewmh:get-_NET_DESKTOP_LAYOUT (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_NET_DESKTOP_LAYOUT)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (long-length :initform 4)))
+(defclass xcb:ewmh:get-_NET_DESKTOP_LAYOUT~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:ewmh:-_NET_DESKTOP_LAYOUT)
+ nil)
+(defclass xcb:ewmh:set-_NET_DESKTOP_LAYOUT
+ (xcb:icccm:-ChangeProperty-explicit xcb:ewmh:-_NET_DESKTOP_LAYOUT)
+ ((property :initform 'xcb:Atom:_NET_DESKTOP_LAYOUT)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_SHOWING_DESKTOP
+(defclass xcb:ewmh:get-_NET_SHOWING_DESKTOP (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_SHOWING_DESKTOP)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_SHOWING_DESKTOP~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_SHOWING_DESKTOP (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_SHOWING_DESKTOP)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:_NET_SHOWING_DESKTOP (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_SHOWING_DESKTOP)
+ (show :initarg :show :type xcb:CARD32)))
+
+;;;; Other Root Window Messages
+
+;; _NET_CLOSE_WINDOW
+(defclass xcb:ewmh:_NET_CLOSE_WINDOW (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_CLOSE_WINDOW)
+ (timestamp :initarg :timestamp :type xcb:CARD32)
+ (source-indication :initarg :source-indication :type xcb:CARD32)))
+
+;; _NET_MOVERESIZE_WINDOW
+(defclass xcb:ewmh:_NET_MOVERESIZE_WINDOW (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_MOVERESIZE_WINDOW)
+ (gravity-and-flags :initarg :gravity-and-flags :type xcb:CARD32)
+ (x :initarg :x :type xcb:CARD32)
+ (y :initarg :y :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD32)
+ (height :initarg :height :type xcb:CARD32)))
+
+;; _NET_WM_MOVERESIZE
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOPLEFT 0)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOP 1)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_TOPRIGHT 2)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_RIGHT 3)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT 4)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOM 5)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT 6)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_LEFT 7)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_MOVE 8)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_SIZE_KEYBOARD 9)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_MOVE_KEYBOARD 10)
+(defconst xcb:ewmh:_NET_WM_MOVERESIZE_CANCEL 11)
+;;
+(defclass xcb:ewmh:_NET_WM_MOVERESIZE (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_WM_MOVERESIZE)
+ (x-root :initarg :x-root :type xcb:CARD32)
+ (y-root :initarg :y-root :type xcb:CARD32)
+ (direction :initarg :direction :type xcb:CARD32)
+ (button :initarg :button :type xcb:CARD32)
+ (source-indication :initarg :source-indication :type xcb:CARD32)))
+
+;; _NET_RESTACK_WINDOW
+(defclass xcb:ewmh:_NET_RESTACK_WINDOW (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_RESTACK_WINDOW)
+ (source-indication :initarg :source-indication :type xcb:CARD32)
+ (sibling :initarg :sibling :type xcb:WINDOW)
+ (detail :initarg :detail :type xcb:CARD32)))
+
+;; _NET_REQUEST_FRAME_EXTENTS
+(defclass xcb:ewmh:_NET_REQUEST_FRAME_EXTENTS (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_REQUEST_FRAME_EXTENTS)))
+
+;;;; Application Window Properties
+
+;; _NET_WM_NAME
+(defclass xcb:ewmh:get-_NET_WM_NAME (xcb:ewmh:-GetProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_WM_NAME)))
+(defclass xcb:ewmh:get-_NET_WM_NAME~reply (xcb:ewmh:-GetProperty-utf8~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_NAME (xcb:ewmh:-ChangeProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_WM_NAME)))
+
+;; _NET_WM_VISIBLE_NAME
+(defclass xcb:ewmh:get-_NET_WM_VISIBLE_NAME (xcb:ewmh:-GetProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_WM_VISIBLE_NAME)))
+(defclass xcb:ewmh:get-_NET_WM_VISIBLE_NAME~reply
+ (xcb:ewmh:-GetProperty-utf8~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_VISIBLE_NAME (xcb:ewmh:-ChangeProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_WM_VISIBLE_NAME)))
+
+;; _NET_WM_ICON_NAME
+(defclass xcb:ewmh:get-_NET_WM_ICON_NAME (xcb:ewmh:-GetProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_WM_ICON_NAME)))
+(defclass xcb:ewmh:get-_NET_WM_ICON_NAME~reply
+ (xcb:ewmh:-GetProperty-utf8~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_ICON_NAME (xcb:ewmh:-ChangeProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_WM_ICON_NAME)))
+
+;; _NET_WM_VISIBLE_ICON_NAME
+(defclass xcb:ewmh:get-_NET_WM_VISIBLE_ICON_NAME (xcb:ewmh:-GetProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_WM_VISIBLE_ICON_NAME)))
+(defclass xcb:ewmh:get-_NET_WM_VISIBLE_ICON_NAME~reply
+ (xcb:ewmh:-GetProperty-utf8~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_VISIBLE_ICON_NAME
+ (xcb:ewmh:-ChangeProperty-utf8)
+ ((property :initform 'xcb:Atom:_NET_WM_VISIBLE_ICON_NAME)))
+
+;; _NET_WM_DESKTOP
+(defclass xcb:ewmh:get-_NET_WM_DESKTOP (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_DESKTOP)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_WM_DESKTOP~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_DESKTOP (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_DESKTOP)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:_NET_WM_DESKTOP (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_WM_DESKTOP)
+ (new-desktop :initarg :new-desktop :type xcb:CARD32)
+ (source-indication :initarg :source-indication :type xcb:CARD32)))
+
+;; _NET_WM_WINDOW_TYPE
+(defclass xcb:ewmh:get-_NET_WM_WINDOW_TYPE (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_WINDOW_TYPE)
+ (type :initform 'xcb:Atom:ATOM)))
+(defclass xcb:ewmh:get-_NET_WM_WINDOW_TYPE~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_WINDOW_TYPE (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_WINDOW_TYPE)
+ (type :initform 'xcb:Atom:ATOM)))
+
+;; _NET_WM_STATE
+(defconst xcb:ewmh:_NET_WM_STATE_REMOVE 0)
+(defconst xcb:ewmh:_NET_WM_STATE_ADD 1)
+(defconst xcb:ewmh:_NET_WM_STATE_TOGGLE 2)
+;;
+(defclass xcb:ewmh:get-_NET_WM_STATE (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_STATE)
+ (type :initform 'xcb:Atom:ATOM)))
+(defclass xcb:ewmh:get-_NET_WM_STATE~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_STATE (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_STATE)
+ (type :initform 'xcb:Atom:ATOM)))
+(defclass xcb:ewmh:_NET_WM_STATE (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:_NET_WM_STATE)
+ (action :initarg :action :type xcb:CARD32)
+ (first-property :initarg :first-property :type xcb:CARD32)
+ (second-property :initarg :second-property :type xcb:CARD32)
+ (source-indication :initarg :source-indication :type xcb:CARD32)))
+
+;; _NET_WM_ALLOWED_ACTIONS
+(defclass xcb:ewmh:get-_NET_WM_ALLOWED_ACTIONS (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_ALLOWED_ACTIONS)
+ (type :initform 'xcb:Atom:ATOM)))
+(defclass xcb:ewmh:get-_NET_WM_ALLOWED_ACTIONS~reply
+ (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_ALLOWED_ACTIONS (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_ALLOWED_ACTIONS)
+ (type :initform 'xcb:Atom:ATOM)))
+
+;; _NET_WM_STRUT
+(defclass xcb:ewmh:-_NET_WM_STRUT (xcb:--struct)
+ ((left :initarg :left :type xcb:-ignore)
+ (right :initarg :right :type xcb:-ignore)
+ (top :initarg :top :type xcb:-ignore)
+ (bottom :initarg :bottom :type xcb:-ignore)))
+;;
+(defclass xcb:ewmh:get-_NET_WM_STRUT (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_NET_WM_STRUT)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (long-length :initform 4)))
+(defclass xcb:ewmh:get-_NET_WM_STRUT~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:ewmh:-_NET_WM_STRUT)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_STRUT
+ (xcb:icccm:-ChangeProperty-explicit xcb:ewmh:-_NET_WM_STRUT)
+ ((property :initform 'xcb:Atom:_NET_WM_STRUT)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_STRUT_PARTIAL
+(defclass xcb:ewmh:-_NET_WM_STRUT_PARTIAL (xcb:--struct)
+ ((left :initarg :left :type xcb:-ignore)
+ (right :initarg :right :type xcb:-ignore)
+ (top :initarg :top :type xcb:-ignore)
+ (bottom :initarg :bottom :type xcb:-ignore)
+ (left-start-y :initarg :left-start-y :type xcb:-ignore)
+ (left-end-y :initarg :left-end-y :type xcb:-ignore)
+ (right-start-y :initarg :right-start-y :type xcb:-ignore)
+ (right-end-y :initarg :right-end-y :type xcb:-ignore)
+ (top-start-x :initarg :top-start-x :type xcb:-ignore)
+ (top-end-x :initarg :top-end-x :type xcb:-ignore)
+ (bottom-start-x :initarg :bottom-start-x :type xcb:-ignore)
+ (bottom-end-x :initarg :bottom-end-x :type xcb:-ignore)))
+;;
+(defclass xcb:ewmh:get-_NET_WM_STRUT_PARTIAL (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_NET_WM_STRUT_PARTIAL)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (long-length :initform 12)))
+(defclass xcb:ewmh:get-_NET_WM_STRUT_PARTIAL~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:ewmh:-_NET_WM_STRUT_PARTIAL)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_STRUT_PARTIAL
+ (xcb:icccm:-ChangeProperty-explicit xcb:ewmh:-_NET_WM_STRUT_PARTIAL)
+ ((property :initform 'xcb:Atom:_NET_WM_STRUT_PARTIAL)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_ICON_GEOMETRY
+(defclass xcb:ewmh:-_NET_WM_ICON_GEOMETRY (xcb:--struct)
+ ((x :initarg :x :type xcb:-ignore)
+ (y :initarg :y :type xcb:-ignore)
+ (width :initarg :width :type xcb:-ignore)
+ (height :initarg :height :type xcb:-ignore)))
+;;
+(defclass xcb:ewmh:get-_NET_WM_ICON_GEOMETRY (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_NET_WM_ICON_GEOMETRY)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (long-length :initform 4)))
+(defclass xcb:ewmh:get-_NET_WM_ICON_GEOMETRY~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:ewmh:-_NET_WM_ICON_GEOMETRY)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_ICON_GEOMETRY
+ (xcb:icccm:-ChangeProperty-explicit xcb:ewmh:-_NET_WM_ICON_GEOMETRY)
+ ((property :initform 'xcb:Atom:_NET_WM_ICON_GEOMETRY)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_ICON
+(defclass xcb:ewmh:-get-_NET_WM_ICON (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_ICON)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:-get-_NET_WM_ICON~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:-set-_NET_WM_ICON (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_ICON)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_PID
+(defclass xcb:ewmh:get-_NET_WM_PID (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_PID)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_WM_PID~reply (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_PID (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_PID)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_HANDLED_ICONS
+(defclass xcb:ewmh:get-_NET_WM_HANDLED_ICONS (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_HANDLED_ICONS)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_WM_HANDLED_ICONS~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_HANDLED_ICONS (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_HANDLED_ICONS)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_USER_TIME
+(defclass xcb:ewmh:get-_NET_WM_USER_TIME (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_USER_TIME)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_WM_USER_TIME~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_USER_TIME (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_USER_TIME)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_USER_TIME_WINDOW
+(defclass xcb:ewmh:get-_NET_WM_USER_TIME_WINDOW (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_USER_TIME_WINDOW)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_WM_USER_TIME_WINDOW~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_USER_TIME_WINDOW
+ (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_USER_TIME_WINDOW)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_FRAME_EXTENTS
+(defclass xcb:ewmh:-_NET_FRAME_EXTENTS (xcb:--struct)
+ ((left :initarg :left :type xcb:-ignore)
+ (right :initarg :right :type xcb:-ignore)
+ (top :initarg :top :type xcb:-ignore)
+ (bottom :initarg :bottom :type xcb:-ignore)))
+;;
+(defclass xcb:ewmh:get-_NET_FRAME_EXTENTS (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_NET_FRAME_EXTENTS)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (long-length :initform 4)))
+(defclass xcb:ewmh:get-_NET_FRAME_EXTENTS~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:ewmh:-_NET_FRAME_EXTENTS)
+ nil)
+(defclass xcb:ewmh:set-_NET_FRAME_EXTENTS
+ (xcb:icccm:-ChangeProperty-explicit xcb:ewmh:-_NET_FRAME_EXTENTS)
+ ((property :initform 'xcb:Atom:_NET_FRAME_EXTENTS)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_OPAQUE_REGION
+(defclass xcb:ewmh:get-_NET_WM_OPAQUE_REGION (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_OPAQUE_REGION)
+ (type :initform 'xcb:Atom:ATOM)))
+(defclass xcb:ewmh:get-_NET_WM_OPAQUE_REGION~reply
+ (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_OPAQUE_REGION (xcb:icccm:-ChangeProperty)
+ ((property :initform 'xcb:Atom:_NET_WM_OPAQUE_REGION)
+ (type :initform 'xcb:Atom:ATOM)))
+
+;; _NET_WM_BYPASS_COMPOSITOR
+(defclass xcb:ewmh:get-_NET_WM_BYPASS_COMPOSITOR
+ (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_BYPASS_COMPOSITOR)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:get-_NET_WM_BYPASS_COMPOSITOR~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_BYPASS_COMPOSITOR
+ (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_WM_BYPASS_COMPOSITOR)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;;;; Window Manager Protocols
+
+;; _NET_WM_PING
+(defclass xcb:ewmh:_NET_WM_PING (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:WM_PROTOCOLS)
+ (protocol :initform 'xcb:Atom:_NET_WM_PING :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:CARD32)
+ (client-window :initarg :client-window :type xcb:WINDOW)))
+
+;; _NET_WM_SYNC_REQUEST
+(defclass xcb:ewmh:_NET_WM_SYNC_REQUEST (xcb:ewmh:-ClientMessage)
+ ((type :initform 'xcb:Atom:WM_PROTOCOLS)
+ (protocol :initform 'xcb:Atom:_NET_WM_SYNC_REQUEST :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:CARD32)
+ (low :initarg :low :type xcb:CARD32)
+ (high :initarg :high :type xcb:CARD32)))
+
+;; _NET_WM_SYNC_REQUEST_COUNTER
+(defclass xcb:ewmh:-_NET_WM_SYNC_REQUEST_COUNTER (xcb:--struct)
+ ((low :initarg :low :type xcb:-ignore)
+ (high :initarg :hight :type xcb:-ignore)))
+;;
+(defclass xcb:ewmh:get-_NET_WM_SYNC_REQUEST_COUNTER
+ (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_NET_WM_SYNC_REQUEST_COUNTER)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (long-length :initform 2)))
+(defclass xcb:ewmh:get-_NET_WM_SYNC_REQUEST_COUNTER~reply
+ (xcb:icccm:-GetProperty-explicit~reply
+ xcb:ewmh:-_NET_WM_SYNC_REQUEST_COUNTER)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_SYNC_REQUEST_COUNTER
+ (xcb:icccm:-ChangeProperty-explicit xcb:ewmh:-_NET_WM_SYNC_REQUEST_COUNTER)
+ ((property :initform 'xcb:Atom:_NET_WM_SYNC_REQUEST_COUNTER)
+ (type :initform 'xcb:Atom:CARDINAL)))
+
+;; _NET_WM_FULLSCREEN_MONITORS
+(defclass xcb:ewmh:-_NET_WM_FULLSCREEN_MONITORS (xcb:--struct)
+ ((top :initarg :top :type xcb:-ignore)
+ (bottom :initarg :bottom :type xcb:-ignore)
+ (left :initarg :left :type xcb:-ignore)
+ (right :initarg :right :type xcb:-ignore)))
+;;
+(defclass xcb:ewmh:get-_NET_WM_FULLSCREEN_MONITORS
+ (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_NET_WM_FULLSCREEN_MONITORS)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (long-length :initform 4)))
+(defclass xcb:ewmh:get-_NET_WM_FULLSCREEN_MONITORS~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:ewmh:-_NET_WM_FULLSCREEN_MONITORS)
+ nil)
+(defclass xcb:ewmh:set-_NET_WM_FULLSCREEN_MONITORS
+ (xcb:icccm:-ChangeProperty-explicit xcb:ewmh:-_NET_WM_FULLSCREEN_MONITORS)
+ ((property :initform 'xcb:Atom:_NET_WM_FULLSCREEN_MONITORS)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:ewmh:_NET_WM_FULLSCREEN_MONITORS
+ (xcb:ewmh:-ClientMessage xcb:ewmh:-_NET_WM_FULLSCREEN_MONITORS)
+ ((type :initform 'xcb:Atom:_NET_WM_FULLSCREEN_MONITORS)))
+
+;;;; Other Properties
+
+;;;; Misc.
+
+(defconst xcb:ewmh:source-indication:none 0)
+(defconst xcb:ewmh:source-indication:normal 1)
+(defconst xcb:ewmh:source-indication:other 2)
+
+
+
+(provide 'xcb-ewmh)
+
+;;; xcb-ewmh.el ends here
diff --git a/elpa/xelb-0.20/xcb-ewmh.elc b/elpa/xelb-0.20/xcb-ewmh.elc
new file mode 100644
index 0000000..5e5c5d4
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-ewmh.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-ge.el b/elpa/xelb-0.20/xcb-ge.el
new file mode 100644
index 0000000..f18c8eb
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-ge.el
@@ -0,0 +1,52 @@
+;;; xcb-ge.el --- X11 GenericEvent extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'ge.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:ge:-extension-xname "Generic Event Extension")
+(defconst xcb:ge:-extension-name "GenericEvent")
+(defconst xcb:ge:-major-version 1)
+(defconst xcb:ge:-minor-version 0)
+
+(defclass xcb:ge:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD16)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD16)))
+(defclass xcb:ge:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+
+
+(provide 'xcb-ge)
+
+;;; xcb-ge.el ends here
diff --git a/elpa/xelb-0.20/xcb-ge.elc b/elpa/xelb-0.20/xcb-ge.elc
new file mode 100644
index 0000000..f25012e
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-ge.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-glx.el b/elpa/xelb-0.20/xcb-glx.el
new file mode 100644
index 0000000..fd1386a
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-glx.el
@@ -0,0 +1,1861 @@
+;;; xcb-glx.el --- X11 Glx extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'glx.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:glx:-extension-xname "GLX")
+(defconst xcb:glx:-extension-name "Glx")
+(defconst xcb:glx:-major-version 1)
+(defconst xcb:glx:-minor-version 4)
+
+(require 'xcb-xproto)
+
+(xcb:deftypealias 'xcb:glx:PIXMAP 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:glx:CONTEXT 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:glx:PBUFFER 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:glx:WINDOW 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:glx:FBCONFIG 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:glx:DRAWABLE 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:glx:FLOAT32 'xcb:float)
+
+(xcb:deftypealias 'xcb:glx:FLOAT64 'xcb:double)
+
+(xcb:deftypealias 'xcb:glx:BOOL32 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:glx:CONTEXT_TAG 'xcb:CARD32)
+
+(defclass xcb:glx:Generic
+ (xcb:-error)
+ ((~code :initform -1)
+ (bad-value :initarg :bad-value :type xcb:CARD32)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD16)
+ (major-opcode :initarg :major-opcode :type xcb:CARD8)
+ (pad~0 :initform 21 :type xcb:-pad)))
+
+(defclass xcb:glx:BadContext
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 0)))
+
+(defclass xcb:glx:BadContextState
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 1)))
+
+(defclass xcb:glx:BadDrawable
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 2)))
+
+(defclass xcb:glx:BadPixmap
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 3)))
+
+(defclass xcb:glx:BadContextTag
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 4)))
+
+(defclass xcb:glx:BadCurrentWindow
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 5)))
+
+(defclass xcb:glx:BadRenderRequest
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 6)))
+
+(defclass xcb:glx:BadLargeRequest
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 7)))
+
+(defclass xcb:glx:UnsupportedPrivateRequest
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 8)))
+
+(defclass xcb:glx:BadFBConfig
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 9)))
+
+(defclass xcb:glx:BadPbuffer
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 10)))
+
+(defclass xcb:glx:BadCurrentDrawable
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 11)))
+
+(defclass xcb:glx:BadWindow
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 12)))
+
+(defclass xcb:glx:GLXBadProfileARB
+ (xcb:-error xcb:glx:Generic)
+ ((~code :initform 13)))
+
+(defclass xcb:glx:PbufferClobber
+ (xcb:-event)
+ ((~code :initform 0)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event-type :initarg :event-type :type xcb:CARD16)
+ (draw-type :initarg :draw-type :type xcb:CARD16)
+ (drawable :initarg :drawable :type xcb:glx:DRAWABLE)
+ (b-mask :initarg :b-mask :type xcb:CARD32)
+ (aux-buffer :initarg :aux-buffer :type xcb:CARD16)
+ (x :initarg :x :type xcb:CARD16)
+ (y :initarg :y :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (count :initarg :count :type xcb:CARD16)
+ (pad~1 :initform 4 :type xcb:-pad)))
+
+(defclass xcb:glx:BufferSwapComplete
+ (xcb:-event)
+ ((~code :initform 1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event-type :initarg :event-type :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:glx:DRAWABLE)
+ (ust-hi :initarg :ust-hi :type xcb:CARD32)
+ (ust-lo :initarg :ust-lo :type xcb:CARD32)
+ (msc-hi :initarg :msc-hi :type xcb:CARD32)
+ (msc-lo :initarg :msc-lo :type xcb:CARD32)
+ (sbc :initarg :sbc :type xcb:CARD32)))
+
+(defconst xcb:glx:PBCET:Damaged 32791)
+(defconst xcb:glx:PBCET:Saved 32792)
+
+(defconst xcb:glx:PBCDT:Window 32793)
+(defconst xcb:glx:PBCDT:Pbuffer 32794)
+
+(defclass xcb:glx:Render
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (data~ :initform
+ '(name data type xcb:BYTE size nil)
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:RenderLarge
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (request-num :initarg :request-num :type xcb:CARD16)
+ (request-total :initarg :request-total :type xcb:CARD16)
+ (data-len :initarg :data-len :type xcb:CARD32)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (xcb:-fieldref 'data-len))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:CreateContext
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (context :initarg :context :type xcb:glx:CONTEXT)
+ (visual :initarg :visual :type xcb:VISUALID)
+ (screen :initarg :screen :type xcb:CARD32)
+ (share-list :initarg :share-list :type xcb:glx:CONTEXT)
+ (is-direct :initarg :is-direct :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:glx:DestroyContext
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (context :initarg :context :type xcb:glx:CONTEXT)))
+
+(defclass xcb:glx:MakeCurrent
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:glx:DRAWABLE)
+ (context :initarg :context :type xcb:glx:CONTEXT)
+ (old-context-tag :initarg :old-context-tag :type xcb:glx:CONTEXT_TAG)))
+(defclass xcb:glx:MakeCurrent~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:glx:IsDirect
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (context :initarg :context :type xcb:glx:CONTEXT)))
+(defclass xcb:glx:IsDirect~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (is-direct :initarg :is-direct :type xcb:BOOL)
+ (pad~1 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:glx:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)))
+(defclass xcb:glx:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:glx:WaitGL
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)))
+
+(defclass xcb:glx:WaitX
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)))
+
+(defclass xcb:glx:CopyContext
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (src :initarg :src :type xcb:glx:CONTEXT)
+ (dest :initarg :dest :type xcb:glx:CONTEXT)
+ (mask :initarg :mask :type xcb:CARD32)
+ (src-context-tag :initarg :src-context-tag :type xcb:glx:CONTEXT_TAG)))
+
+(defconst xcb:glx:GC:GL_CURRENT_BIT 1)
+(defconst xcb:glx:GC:GL_POINT_BIT 2)
+(defconst xcb:glx:GC:GL_LINE_BIT 4)
+(defconst xcb:glx:GC:GL_POLYGON_BIT 8)
+(defconst xcb:glx:GC:GL_POLYGON_STIPPLE_BIT 16)
+(defconst xcb:glx:GC:GL_PIXEL_MODE_BIT 32)
+(defconst xcb:glx:GC:GL_LIGHTING_BIT 64)
+(defconst xcb:glx:GC:GL_FOG_BIT 128)
+(defconst xcb:glx:GC:GL_DEPTH_BUFFER_BIT 256)
+(defconst xcb:glx:GC:GL_ACCUM_BUFFER_BIT 512)
+(defconst xcb:glx:GC:GL_STENCIL_BUFFER_BIT 1024)
+(defconst xcb:glx:GC:GL_VIEWPORT_BIT 2048)
+(defconst xcb:glx:GC:GL_TRANSFORM_BIT 4096)
+(defconst xcb:glx:GC:GL_ENABLE_BIT 8192)
+(defconst xcb:glx:GC:GL_COLOR_BUFFER_BIT 16384)
+(defconst xcb:glx:GC:GL_HINT_BIT 32768)
+(defconst xcb:glx:GC:GL_EVAL_BIT 65536)
+(defconst xcb:glx:GC:GL_LIST_BIT 131072)
+(defconst xcb:glx:GC:GL_TEXTURE_BIT 262144)
+(defconst xcb:glx:GC:GL_SCISSOR_BIT 524288)
+(defconst xcb:glx:GC:GL_ALL_ATTRIB_BITS 16777215)
+
+(defclass xcb:glx:SwapBuffers
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (drawable :initarg :drawable :type xcb:glx:DRAWABLE)))
+
+(defclass xcb:glx:UseXFont
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (font :initarg :font :type xcb:FONT)
+ (first :initarg :first :type xcb:CARD32)
+ (count :initarg :count :type xcb:CARD32)
+ (list-base :initarg :list-base :type xcb:CARD32)))
+
+(defclass xcb:glx:CreateGLXPixmap
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (visual :initarg :visual :type xcb:VISUALID)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)
+ (glx-pixmap :initarg :glx-pixmap :type xcb:glx:PIXMAP)))
+
+(defclass xcb:glx:GetVisualConfigs
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:glx:GetVisualConfigs~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-visuals :initarg :num-visuals :type xcb:CARD32)
+ (num-properties :initarg :num-properties :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)
+ (property-list~ :initform
+ '(name property-list type xcb:CARD32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (property-list :initarg :property-list :type xcb:-ignore)))
+
+(defclass xcb:glx:DestroyGLXPixmap
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (glx-pixmap :initarg :glx-pixmap :type xcb:glx:PIXMAP)))
+
+(defclass xcb:glx:VendorPrivate
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (vendor-code :initarg :vendor-code :type xcb:CARD32)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (data~ :initform
+ '(name data type xcb:BYTE size nil)
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:VendorPrivateWithReply
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (vendor-code :initarg :vendor-code :type xcb:CARD32)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (data~ :initform
+ '(name data type xcb:BYTE size nil)
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+(defclass xcb:glx:VendorPrivateWithReply~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (retval :initarg :retval :type xcb:CARD32)
+ (data1~ :initform
+ '(name data1 type xcb:BYTE size 24)
+ :type xcb:-list)
+ (data1 :initarg :data1 :type xcb:-ignore)
+ (data2~ :initform
+ '(name data2 type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data2 :initarg :data2 :type xcb:-ignore)))
+
+(defclass xcb:glx:QueryExtensionsString
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:glx:QueryExtensionsString~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (pad~2 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:glx:QueryServerString
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (name :initarg :name :type xcb:CARD32)))
+(defclass xcb:glx:QueryServerString~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (str-len :initarg :str-len :type xcb:CARD32)
+ (pad~2 :initform 16 :type xcb:-pad)
+ (string~ :initform
+ '(name string type xcb:char size
+ (xcb:-fieldref 'str-len))
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)))
+
+(defclass xcb:glx:ClientInfo
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (str-len :initarg :str-len :type xcb:CARD32)
+ (string~ :initform
+ '(name string type xcb:char size
+ (xcb:-fieldref 'str-len))
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)))
+
+(defclass xcb:glx:GetFBConfigs
+ (xcb:-request)
+ ((~opcode :initform 21 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:glx:GetFBConfigs~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-FB-configs :initarg :num-FB-configs :type xcb:CARD32)
+ (num-properties :initarg :num-properties :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)
+ (property-list~ :initform
+ '(name property-list type xcb:CARD32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (property-list :initarg :property-list :type xcb:-ignore)))
+
+(defclass xcb:glx:CreatePixmap
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (fbconfig :initarg :fbconfig :type xcb:glx:FBCONFIG)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)
+ (glx-pixmap :initarg :glx-pixmap :type xcb:glx:PIXMAP)
+ (num-attribs :initarg :num-attribs :type xcb:CARD32)
+ (attribs~ :initform
+ '(name attribs type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-attribs)
+ 2))
+ :type xcb:-list)
+ (attribs :initarg :attribs :type xcb:-ignore)))
+
+(defclass xcb:glx:DestroyPixmap
+ (xcb:-request)
+ ((~opcode :initform 23 :type xcb:-u1)
+ (glx-pixmap :initarg :glx-pixmap :type xcb:glx:PIXMAP)))
+
+(defclass xcb:glx:CreateNewContext
+ (xcb:-request)
+ ((~opcode :initform 24 :type xcb:-u1)
+ (context :initarg :context :type xcb:glx:CONTEXT)
+ (fbconfig :initarg :fbconfig :type xcb:glx:FBCONFIG)
+ (screen :initarg :screen :type xcb:CARD32)
+ (render-type :initarg :render-type :type xcb:CARD32)
+ (share-list :initarg :share-list :type xcb:glx:CONTEXT)
+ (is-direct :initarg :is-direct :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:glx:QueryContext
+ (xcb:-request)
+ ((~opcode :initform 25 :type xcb:-u1)
+ (context :initarg :context :type xcb:glx:CONTEXT)))
+(defclass xcb:glx:QueryContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-attribs :initarg :num-attribs :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (attribs~ :initform
+ '(name attribs type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-attribs)
+ 2))
+ :type xcb:-list)
+ (attribs :initarg :attribs :type xcb:-ignore)))
+
+(defclass xcb:glx:MakeContextCurrent
+ (xcb:-request)
+ ((~opcode :initform 26 :type xcb:-u1)
+ (old-context-tag :initarg :old-context-tag :type xcb:glx:CONTEXT_TAG)
+ (drawable :initarg :drawable :type xcb:glx:DRAWABLE)
+ (read-drawable :initarg :read-drawable :type xcb:glx:DRAWABLE)
+ (context :initarg :context :type xcb:glx:CONTEXT)))
+(defclass xcb:glx:MakeContextCurrent~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:glx:CreatePbuffer
+ (xcb:-request)
+ ((~opcode :initform 27 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (fbconfig :initarg :fbconfig :type xcb:glx:FBCONFIG)
+ (pbuffer :initarg :pbuffer :type xcb:glx:PBUFFER)
+ (num-attribs :initarg :num-attribs :type xcb:CARD32)
+ (attribs~ :initform
+ '(name attribs type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-attribs)
+ 2))
+ :type xcb:-list)
+ (attribs :initarg :attribs :type xcb:-ignore)))
+
+(defclass xcb:glx:DestroyPbuffer
+ (xcb:-request)
+ ((~opcode :initform 28 :type xcb:-u1)
+ (pbuffer :initarg :pbuffer :type xcb:glx:PBUFFER)))
+
+(defclass xcb:glx:GetDrawableAttributes
+ (xcb:-request)
+ ((~opcode :initform 29 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:glx:DRAWABLE)))
+(defclass xcb:glx:GetDrawableAttributes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-attribs :initarg :num-attribs :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (attribs~ :initform
+ '(name attribs type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-attribs)
+ 2))
+ :type xcb:-list)
+ (attribs :initarg :attribs :type xcb:-ignore)))
+
+(defclass xcb:glx:ChangeDrawableAttributes
+ (xcb:-request)
+ ((~opcode :initform 30 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:glx:DRAWABLE)
+ (num-attribs :initarg :num-attribs :type xcb:CARD32)
+ (attribs~ :initform
+ '(name attribs type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-attribs)
+ 2))
+ :type xcb:-list)
+ (attribs :initarg :attribs :type xcb:-ignore)))
+
+(defclass xcb:glx:CreateWindow
+ (xcb:-request)
+ ((~opcode :initform 31 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (fbconfig :initarg :fbconfig :type xcb:glx:FBCONFIG)
+ (window :initarg :window :type xcb:WINDOW)
+ (glx-window :initarg :glx-window :type xcb:glx:WINDOW)
+ (num-attribs :initarg :num-attribs :type xcb:CARD32)
+ (attribs~ :initform
+ '(name attribs type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-attribs)
+ 2))
+ :type xcb:-list)
+ (attribs :initarg :attribs :type xcb:-ignore)))
+
+(defclass xcb:glx:DeleteWindow
+ (xcb:-request)
+ ((~opcode :initform 32 :type xcb:-u1)
+ (glxwindow :initarg :glxwindow :type xcb:glx:WINDOW)))
+
+(defclass xcb:glx:SetClientInfoARB
+ (xcb:-request)
+ ((~opcode :initform 33 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (num-versions :initarg :num-versions :type xcb:CARD32)
+ (gl-str-len :initarg :gl-str-len :type xcb:CARD32)
+ (glx-str-len :initarg :glx-str-len :type xcb:CARD32)
+ (gl-versions~ :initform
+ '(name gl-versions type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-versions)
+ 2))
+ :type xcb:-list)
+ (gl-versions :initarg :gl-versions :type xcb:-ignore)
+ (gl-extension-string~ :initform
+ '(name gl-extension-string type xcb:char size
+ (xcb:-fieldref 'gl-str-len))
+ :type xcb:-list)
+ (gl-extension-string :initarg :gl-extension-string :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (glx-extension-string~ :initform
+ '(name glx-extension-string type xcb:char size
+ (xcb:-fieldref 'glx-str-len))
+ :type xcb:-list)
+ (glx-extension-string :initarg :glx-extension-string :type xcb:-ignore)))
+
+(defclass xcb:glx:CreateContextAttribsARB
+ (xcb:-request)
+ ((~opcode :initform 34 :type xcb:-u1)
+ (context :initarg :context :type xcb:glx:CONTEXT)
+ (fbconfig :initarg :fbconfig :type xcb:glx:FBCONFIG)
+ (screen :initarg :screen :type xcb:CARD32)
+ (share-list :initarg :share-list :type xcb:glx:CONTEXT)
+ (is-direct :initarg :is-direct :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (num-attribs :initarg :num-attribs :type xcb:CARD32)
+ (attribs~ :initform
+ '(name attribs type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-attribs)
+ 2))
+ :type xcb:-list)
+ (attribs :initarg :attribs :type xcb:-ignore)))
+
+(defclass xcb:glx:SetClientInfo2ARB
+ (xcb:-request)
+ ((~opcode :initform 35 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (num-versions :initarg :num-versions :type xcb:CARD32)
+ (gl-str-len :initarg :gl-str-len :type xcb:CARD32)
+ (glx-str-len :initarg :glx-str-len :type xcb:CARD32)
+ (gl-versions~ :initform
+ '(name gl-versions type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'num-versions)
+ 3))
+ :type xcb:-list)
+ (gl-versions :initarg :gl-versions :type xcb:-ignore)
+ (gl-extension-string~ :initform
+ '(name gl-extension-string type xcb:char size
+ (xcb:-fieldref 'gl-str-len))
+ :type xcb:-list)
+ (gl-extension-string :initarg :gl-extension-string :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (glx-extension-string~ :initform
+ '(name glx-extension-string type xcb:char size
+ (xcb:-fieldref 'glx-str-len))
+ :type xcb:-list)
+ (glx-extension-string :initarg :glx-extension-string :type xcb:-ignore)))
+
+(defclass xcb:glx:NewList
+ (xcb:-request)
+ ((~opcode :initform 101 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (list :initarg :list :type xcb:CARD32)
+ (mode :initarg :mode :type xcb:CARD32)))
+
+(defclass xcb:glx:EndList
+ (xcb:-request)
+ ((~opcode :initform 102 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)))
+
+(defclass xcb:glx:DeleteLists
+ (xcb:-request)
+ ((~opcode :initform 103 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (list :initarg :list :type xcb:CARD32)
+ (range :initarg :range :type xcb:INT32)))
+
+(defclass xcb:glx:GenLists
+ (xcb:-request)
+ ((~opcode :initform 104 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (range :initarg :range :type xcb:INT32)))
+(defclass xcb:glx:GenLists~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ret-val :initarg :ret-val :type xcb:CARD32)))
+
+(defclass xcb:glx:FeedbackBuffer
+ (xcb:-request)
+ ((~opcode :initform 105 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (size :initarg :size :type xcb:INT32)
+ (type :initarg :type :type xcb:INT32)))
+
+(defclass xcb:glx:SelectBuffer
+ (xcb:-request)
+ ((~opcode :initform 106 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (size :initarg :size :type xcb:INT32)))
+
+(defclass xcb:glx:RenderMode
+ (xcb:-request)
+ ((~opcode :initform 107 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (mode :initarg :mode :type xcb:CARD32)))
+(defclass xcb:glx:RenderMode~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ret-val :initarg :ret-val :type xcb:CARD32)
+ (n :initarg :n :type xcb:CARD32)
+ (new-mode :initarg :new-mode :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:CARD32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defconst xcb:glx:RM:GL_RENDER 7168)
+(defconst xcb:glx:RM:GL_FEEDBACK 7169)
+(defconst xcb:glx:RM:GL_SELECT 7170)
+
+(defclass xcb:glx:Finish
+ (xcb:-request)
+ ((~opcode :initform 108 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)))
+(defclass xcb:glx:Finish~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:glx:PixelStoref
+ (xcb:-request)
+ ((~opcode :initform 109 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (pname :initarg :pname :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)))
+
+(defclass xcb:glx:PixelStorei
+ (xcb:-request)
+ ((~opcode :initform 110 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (pname :initarg :pname :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)))
+
+(defclass xcb:glx:ReadPixels
+ (xcb:-request)
+ ((~opcode :initform 111 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (x :initarg :x :type xcb:INT32)
+ (y :initarg :y :type xcb:INT32)
+ (width :initarg :width :type xcb:INT32)
+ (height :initarg :height :type xcb:INT32)
+ (format :initarg :format :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD32)
+ (swap-bytes :initarg :swap-bytes :type xcb:BOOL)
+ (lsb-first :initarg :lsb-first :type xcb:BOOL)))
+(defclass xcb:glx:ReadPixels~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetBooleanv
+ (xcb:-request)
+ ((~opcode :initform 112 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (pname :initarg :pname :type xcb:INT32)))
+(defclass xcb:glx:GetBooleanv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:BOOL)
+ (pad~2 :initform 15 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BOOL size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetClipPlane
+ (xcb:-request)
+ ((~opcode :initform 113 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (plane :initarg :plane :type xcb:INT32)))
+(defclass xcb:glx:GetClipPlane~reply
+ (xcb:-reply)
+ ((pad~0 :initform 8 :type xcb:-pad-align)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (pad~2 :initform 24 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT64 size
+ (/
+ (xcb:-fieldref 'length)
+ 2))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetDoublev
+ (xcb:-request)
+ ((~opcode :initform 114 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetDoublev~reply
+ (xcb:-reply)
+ ((pad~0 :initform 8 :type xcb:-pad-align)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (pad~2 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT64)
+ (pad~3 :initform 8 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT64 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetError
+ (xcb:-request)
+ ((~opcode :initform 115 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)))
+(defclass xcb:glx:GetError~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (error :initarg :error :type xcb:INT32)))
+
+(defclass xcb:glx:GetFloatv
+ (xcb:-request)
+ ((~opcode :initform 116 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetFloatv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetIntegerv
+ (xcb:-request)
+ ((~opcode :initform 117 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetIntegerv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetLightfv
+ (xcb:-request)
+ ((~opcode :initform 118 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (light :initarg :light :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetLightfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetLightiv
+ (xcb:-request)
+ ((~opcode :initform 119 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (light :initarg :light :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetLightiv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetMapdv
+ (xcb:-request)
+ ((~opcode :initform 120 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (query :initarg :query :type xcb:CARD32)))
+(defclass xcb:glx:GetMapdv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 8 :type xcb:-pad-align)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (pad~2 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT64)
+ (pad~3 :initform 8 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT64 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetMapfv
+ (xcb:-request)
+ ((~opcode :initform 121 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (query :initarg :query :type xcb:CARD32)))
+(defclass xcb:glx:GetMapfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetMapiv
+ (xcb:-request)
+ ((~opcode :initform 122 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (query :initarg :query :type xcb:CARD32)))
+(defclass xcb:glx:GetMapiv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetMaterialfv
+ (xcb:-request)
+ ((~opcode :initform 123 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (face :initarg :face :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetMaterialfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetMaterialiv
+ (xcb:-request)
+ ((~opcode :initform 124 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (face :initarg :face :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetMaterialiv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetPixelMapfv
+ (xcb:-request)
+ ((~opcode :initform 125 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (map :initarg :map :type xcb:CARD32)))
+(defclass xcb:glx:GetPixelMapfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetPixelMapuiv
+ (xcb:-request)
+ ((~opcode :initform 126 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (map :initarg :map :type xcb:CARD32)))
+(defclass xcb:glx:GetPixelMapuiv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:CARD32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:CARD32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetPixelMapusv
+ (xcb:-request)
+ ((~opcode :initform 127 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (map :initarg :map :type xcb:CARD32)))
+(defclass xcb:glx:GetPixelMapusv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:CARD16)
+ (pad~2 :initform 16 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:CARD16 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetPolygonStipple
+ (xcb:-request)
+ ((~opcode :initform 128 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (lsb-first :initarg :lsb-first :type xcb:BOOL)))
+(defclass xcb:glx:GetPolygonStipple~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetString
+ (xcb:-request)
+ ((~opcode :initform 129 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (name :initarg :name :type xcb:CARD32)))
+(defclass xcb:glx:GetString~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (pad~2 :initform 16 :type xcb:-pad)
+ (string~ :initform
+ '(name string type xcb:char size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexEnvfv
+ (xcb:-request)
+ ((~opcode :initform 130 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexEnvfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexEnviv
+ (xcb:-request)
+ ((~opcode :initform 131 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexEnviv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexGendv
+ (xcb:-request)
+ ((~opcode :initform 132 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (coord :initarg :coord :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexGendv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 8 :type xcb:-pad-align)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (pad~2 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT64)
+ (pad~3 :initform 8 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT64 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexGenfv
+ (xcb:-request)
+ ((~opcode :initform 133 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (coord :initarg :coord :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexGenfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexGeniv
+ (xcb:-request)
+ ((~opcode :initform 134 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (coord :initarg :coord :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexGeniv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexImage
+ (xcb:-request)
+ ((~opcode :initform 135 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (level :initarg :level :type xcb:INT32)
+ (format :initarg :format :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD32)
+ (swap-bytes :initarg :swap-bytes :type xcb:BOOL)))
+(defclass xcb:glx:GetTexImage~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (width :initarg :width :type xcb:INT32)
+ (height :initarg :height :type xcb:INT32)
+ (depth :initarg :depth :type xcb:INT32)
+ (pad~2 :initform 4 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexParameterfv
+ (xcb:-request)
+ ((~opcode :initform 136 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexParameterfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexParameteriv
+ (xcb:-request)
+ ((~opcode :initform 137 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexParameteriv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexLevelParameterfv
+ (xcb:-request)
+ ((~opcode :initform 138 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (level :initarg :level :type xcb:INT32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexLevelParameterfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetTexLevelParameteriv
+ (xcb:-request)
+ ((~opcode :initform 139 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (level :initarg :level :type xcb:INT32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetTexLevelParameteriv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:IsEnabled
+ (xcb:-request)
+ ((~opcode :initform 140 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (capability :initarg :capability :type xcb:CARD32)))
+(defclass xcb:glx:IsEnabled~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ret-val :initarg :ret-val :type xcb:glx:BOOL32)))
+
+(defclass xcb:glx:IsList
+ (xcb:-request)
+ ((~opcode :initform 141 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (list :initarg :list :type xcb:CARD32)))
+(defclass xcb:glx:IsList~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ret-val :initarg :ret-val :type xcb:glx:BOOL32)))
+
+(defclass xcb:glx:Flush
+ (xcb:-request)
+ ((~opcode :initform 142 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)))
+
+(defclass xcb:glx:AreTexturesResident
+ (xcb:-request)
+ ((~opcode :initform 143 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (n :initarg :n :type xcb:INT32)
+ (textures~ :initform
+ '(name textures type xcb:CARD32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (textures :initarg :textures :type xcb:-ignore)))
+(defclass xcb:glx:AreTexturesResident~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ret-val :initarg :ret-val :type xcb:glx:BOOL32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BOOL size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:DeleteTextures
+ (xcb:-request)
+ ((~opcode :initform 144 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (n :initarg :n :type xcb:INT32)
+ (textures~ :initform
+ '(name textures type xcb:CARD32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (textures :initarg :textures :type xcb:-ignore)))
+
+(defclass xcb:glx:GenTextures
+ (xcb:-request)
+ ((~opcode :initform 145 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (n :initarg :n :type xcb:INT32)))
+(defclass xcb:glx:GenTextures~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:CARD32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:IsTexture
+ (xcb:-request)
+ ((~opcode :initform 146 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (texture :initarg :texture :type xcb:CARD32)))
+(defclass xcb:glx:IsTexture~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ret-val :initarg :ret-val :type xcb:glx:BOOL32)))
+
+(defclass xcb:glx:GetColorTable
+ (xcb:-request)
+ ((~opcode :initform 147 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD32)
+ (swap-bytes :initarg :swap-bytes :type xcb:BOOL)))
+(defclass xcb:glx:GetColorTable~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (width :initarg :width :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetColorTableParameterfv
+ (xcb:-request)
+ ((~opcode :initform 148 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetColorTableParameterfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetColorTableParameteriv
+ (xcb:-request)
+ ((~opcode :initform 149 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetColorTableParameteriv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetConvolutionFilter
+ (xcb:-request)
+ ((~opcode :initform 150 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD32)
+ (swap-bytes :initarg :swap-bytes :type xcb:BOOL)))
+(defclass xcb:glx:GetConvolutionFilter~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (width :initarg :width :type xcb:INT32)
+ (height :initarg :height :type xcb:INT32)
+ (pad~2 :initform 8 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetConvolutionParameterfv
+ (xcb:-request)
+ ((~opcode :initform 151 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetConvolutionParameterfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetConvolutionParameteriv
+ (xcb:-request)
+ ((~opcode :initform 152 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetConvolutionParameteriv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetSeparableFilter
+ (xcb:-request)
+ ((~opcode :initform 153 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD32)
+ (swap-bytes :initarg :swap-bytes :type xcb:BOOL)))
+(defclass xcb:glx:GetSeparableFilter~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (row-w :initarg :row-w :type xcb:INT32)
+ (col-h :initarg :col-h :type xcb:INT32)
+ (pad~2 :initform 8 :type xcb:-pad)
+ (rows-and-cols~ :initform
+ '(name rows-and-cols type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (rows-and-cols :initarg :rows-and-cols :type xcb:-ignore)))
+
+(defclass xcb:glx:GetHistogram
+ (xcb:-request)
+ ((~opcode :initform 154 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD32)
+ (swap-bytes :initarg :swap-bytes :type xcb:BOOL)
+ (reset :initarg :reset :type xcb:BOOL)))
+(defclass xcb:glx:GetHistogram~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (width :initarg :width :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetHistogramParameterfv
+ (xcb:-request)
+ ((~opcode :initform 155 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetHistogramParameterfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetHistogramParameteriv
+ (xcb:-request)
+ ((~opcode :initform 156 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetHistogramParameteriv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetMinmax
+ (xcb:-request)
+ ((~opcode :initform 157 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD32)
+ (swap-bytes :initarg :swap-bytes :type xcb:BOOL)
+ (reset :initarg :reset :type xcb:BOOL)))
+(defclass xcb:glx:GetMinmax~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetMinmaxParameterfv
+ (xcb:-request)
+ ((~opcode :initform 158 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetMinmaxParameterfv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:glx:FLOAT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:glx:FLOAT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetMinmaxParameteriv
+ (xcb:-request)
+ ((~opcode :initform 159 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetMinmaxParameteriv~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetCompressedTexImageARB
+ (xcb:-request)
+ ((~opcode :initform 160 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (level :initarg :level :type xcb:INT32)))
+(defclass xcb:glx:GetCompressedTexImageARB~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (size :initarg :size :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:DeleteQueriesARB
+ (xcb:-request)
+ ((~opcode :initform 161 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (n :initarg :n :type xcb:INT32)
+ (ids~ :initform
+ '(name ids type xcb:CARD32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (ids :initarg :ids :type xcb:-ignore)))
+
+(defclass xcb:glx:GenQueriesARB
+ (xcb:-request)
+ ((~opcode :initform 162 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (n :initarg :n :type xcb:INT32)))
+(defclass xcb:glx:GenQueriesARB~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:CARD32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:IsQueryARB
+ (xcb:-request)
+ ((~opcode :initform 163 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (id :initarg :id :type xcb:CARD32)))
+(defclass xcb:glx:IsQueryARB~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ret-val :initarg :ret-val :type xcb:glx:BOOL32)))
+
+(defclass xcb:glx:GetQueryivARB
+ (xcb:-request)
+ ((~opcode :initform 164 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (target :initarg :target :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetQueryivARB~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetQueryObjectivARB
+ (xcb:-request)
+ ((~opcode :initform 165 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (id :initarg :id :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetQueryObjectivARB~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:INT32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:INT32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:glx:GetQueryObjectuivARB
+ (xcb:-request)
+ ((~opcode :initform 166 :type xcb:-u1)
+ (context-tag :initarg :context-tag :type xcb:glx:CONTEXT_TAG)
+ (id :initarg :id :type xcb:CARD32)
+ (pname :initarg :pname :type xcb:CARD32)))
+(defclass xcb:glx:GetQueryObjectuivARB~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (n :initarg :n :type xcb:CARD32)
+ (datum :initarg :datum :type xcb:CARD32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:CARD32 size
+ (xcb:-fieldref 'n))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defconst xcb:glx:error-number-class-alist
+ '((-1 . xcb:glx:Generic)
+ (0 . xcb:glx:BadContext)
+ (1 . xcb:glx:BadContextState)
+ (2 . xcb:glx:BadDrawable)
+ (3 . xcb:glx:BadPixmap)
+ (4 . xcb:glx:BadContextTag)
+ (5 . xcb:glx:BadCurrentWindow)
+ (6 . xcb:glx:BadRenderRequest)
+ (7 . xcb:glx:BadLargeRequest)
+ (8 . xcb:glx:UnsupportedPrivateRequest)
+ (9 . xcb:glx:BadFBConfig)
+ (10 . xcb:glx:BadPbuffer)
+ (11 . xcb:glx:BadCurrentDrawable)
+ (12 . xcb:glx:BadWindow)
+ (13 . xcb:glx:GLXBadProfileARB))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:glx:event-number-class-alist
+ '((0 . xcb:glx:PbufferClobber)
+ (1 . xcb:glx:BufferSwapComplete))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-glx)
+
+;;; xcb-glx.el ends here
diff --git a/elpa/xelb-0.20/xcb-glx.elc b/elpa/xelb-0.20/xcb-glx.elc
new file mode 100644
index 0000000..df17428
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-glx.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-icccm.el b/elpa/xelb-0.20/xcb-icccm.el
new file mode 100644
index 0000000..44ea8a1
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-icccm.el
@@ -0,0 +1,563 @@
+;;; xcb-icccm.el --- Inter-Client Communication -*- lexical-binding: t -*-
+;;; Conventions Manual
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library implements ICCCM the same way as xcb/util-wm.
+
+;; Usage tips:
+;; + Do not forget to call `xcb:icccm:init' for _every_ connection using
+;; this library.
+;; + Use `xcb:icccm:SendEvent' instead of `xcb:SendEvent' to send client
+;; messages defined in this library.
+
+;; Todo:
+;; + Interned atoms are actually connection-dependent. Currently they are
+;; simply saved as global variables.
+
+;; References:
+;; + ICCCM (http://www.x.org/releases/X11R7.7/doc/xorg-docs/icccm/icccm.txt)
+;; + xcb/util-wm (git://anongit.freedesktop.org/xcb/util-wm)
+
+;;; Code:
+
+(eval-when-compile (require 'cl-lib))
+(require 'xcb)
+
+;;;; ICCCM atoms
+
+(eval-and-compile
+ (defconst xcb:icccm:-atoms
+ '(UTF8_STRING COMPOUND_TEXT TEXT C_STRING MANAGER
+ WM_PROTOCOLS WM_TAKE_FOCUS WM_DELETE_WINDOW
+ WM_STATE WM_CHANGE_STATE WM_S0)
+ "Atoms involved in ICCCM.")
+
+ (dolist (atom xcb:icccm:-atoms)
+ (eval `(defvar ,(intern (concat "xcb:Atom:" (symbol-name atom))) nil))))
+
+(cl-defmethod xcb:icccm:init ((obj xcb:connection) &optional force)
+ "Initialize ICCCM module.
+
+This method must be called before using any other method in this module."
+ (when (or force (not xcb:Atom:WM_PROTOCOLS))
+ (let ((atoms xcb:icccm:-atoms))
+ (dotimes (i (1- (x-display-screens)))
+ (push (intern (format "WM_S%d" (1+ i))) atoms))
+ (xcb:icccm:intern-atoms obj atoms force))))
+
+(cl-defmethod xcb:icccm:intern-atoms ((obj xcb:connection) atoms
+ &optional force)
+ "Intern the X atoms listed in the list ATOMS.
+
+The value of these atoms will be available in `xcb:Atom' namespace."
+ (dolist (atom atoms)
+ (let* ((name (symbol-name atom))
+ (var-name (intern (concat "xcb:Atom:" name))))
+ (when (or force (not (and (boundp var-name) (symbol-value var-name))))
+ (set var-name
+ (slot-value (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:InternAtom
+ :only-if-exists 0
+ :name-len (length name)
+ :name name))
+ 'atom))))))
+
+;;;; Client message
+
+(defclass xcb:icccm:SendEvent (xcb:SendEvent)
+ ((propagate :initform 0)
+ (event-mask :initform 'xcb:EventMask:NoEvent))
+ :documentation "A fork of `xcb:SendEvent' to send ICCCM client messages.")
+
+(defclass xcb:icccm:--ClientMessage (xcb:--struct)
+ ((data :type xcb:-ignore)) ;shadowed slot
+ :documentation "To shadow the data slot in `xcb:ClientMessage'.")
+;;
+(defclass xcb:icccm:-ClientMessage
+ (xcb:icccm:--ClientMessage xcb:ClientMessage)
+ ((format :initform 32)
+ (type :initform 'xcb:Atom:WM_PROTOCOLS)
+ (protocol :type xcb:ATOM) ;new slot
+ (time :initarg :time :type xcb:TIMESTAMP) ;new slot
+ (pad~0 :initform 12 :type xcb:-pad)) ;new slot
+ :documentation "An ICCCM client message with data slot replaced by
+protocol and time.")
+
+(defclass xcb:icccm:-ManagerSelection
+ (xcb:icccm:--ClientMessage xcb:ClientMessage)
+ ((format :initform 32)
+ (type :initform 'xcb:Atom:MANAGER)
+ (time :initarg :time :type xcb:TIMESTAMP) ;new slot
+ (selection :initarg :selection :type xcb:ATOM) ;new slot
+ (owner :initarg :owner :type xcb:WINDOW)) ;new slot
+ :documentation "Announce that selection was successfully acquired.")
+
+(defclass xcb:icccm:WM_DELETE_WINDOW (xcb:icccm:-ClientMessage)
+ ((protocol :initform 'xcb:Atom:WM_DELETE_WINDOW)
+ (time :initform 'xcb:Time:CurrentTime))
+ :documentation "Delete a window using the WM_DELETE_WINDOW client message.")
+
+(defclass xcb:icccm:WM_TAKE_FOCUS (xcb:icccm:-ClientMessage)
+ ((protocol :initform 'xcb:Atom:WM_TAKE_FOCUS))
+ :documentation "Set a focus using the WM_TAKE_FOCUS client message.
+
+A valid timestamp (rather than `xcb:Time:CurrentTime') must be supplied.")
+
+;;;; Abstract classes for getting/changing (plain) list properties
+
+(defclass xcb:icccm:-GetProperty (xcb:GetProperty)
+ ((delete :initform 0)
+ (long-offset :initform 0)
+ (long-length :initform 1000000000.)) ;as long as possible
+ :documentation "Get an ICCCM property (request part).")
+
+(defclass xcb:icccm:-GetProperty~reply (xcb:GetProperty~reply)
+ nil
+ :documentation "Get an ICCCM property (reply part).")
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:-GetProperty~reply) byte-array)
+ "Fill in the fields in the reply of ICCCM GetProperty request OBJ
+according to BYTE-ARRAY.
+
+This method automatically format the value as 8, 16 or 32 bits array."
+ (let ((retval (cl-call-next-method obj byte-array))
+ tmp)
+ (with-slots (~lsb length format value-len value) obj
+ (if (or (= 0 value-len) (= 0 length))
+ (setf value nil) ;no available value
+ (setq tmp value ;long-offset is always 0
+ value nil)
+ (pcase format
+ (8
+ (cl-assert (= value-len (length tmp)))
+ (setf value tmp))
+ (16
+ (cl-assert (= (* 2 value-len) (length tmp)))
+ (if ~lsb
+ (dotimes (_ value-len)
+ (setf value (vconcat value
+ (vector (xcb:-unpack-u2-lsb tmp 0))))
+ (setq tmp (substring tmp 2)))
+ (dotimes (_ value-len)
+ (setf value (vconcat value
+ (vector (xcb:-unpack-u2 tmp 0))))
+ (setq tmp (substring tmp 2)))))
+ (32
+ (cl-assert (= (* 4 value-len) (length tmp)))
+ (if ~lsb
+ (dotimes (_ value-len)
+ (setf value (vconcat value
+ (vector (xcb:-unpack-u4-lsb tmp 0))))
+ (setq tmp (substring tmp 4)))
+ (dotimes (_ value-len)
+ (setf value (vconcat value (vector (xcb:-unpack-u4 tmp 0))))
+ (setq tmp (substring tmp 4)))))
+ (_ (cl-assert nil)))))
+ retval))
+
+(defclass xcb:icccm:-ChangeProperty (xcb:ChangeProperty)
+ ((mode :initform 'xcb:PropMode:Replace)
+ (format :initform 32)
+ (data :initform nil))
+ :documentation "Change an ICCCM property.")
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty))
+ "Return the byte-array representation of an ICCCM ChangeProperty request.
+
+This method automatically sets the data length."
+ (with-slots (~lsb format data-len data) obj
+ (setf data-len (length data))
+ (setf data
+ (pcase format
+ (8 data)
+ (16 (mapconcat (lambda (i) (if ~lsb (xcb:-pack-u2-lsb i)
+ (xcb:-pack-u2 i)))
+ data []))
+ (32 (mapconcat (lambda (i) (if ~lsb (xcb:-pack-u4-lsb i)
+ (xcb:-pack-u4 i)))
+ data []))
+ (_ (cl-assert nil)))))
+ (cl-call-next-method obj))
+
+;;;; Abstract classes for getting/changing text properties
+
+(defclass xcb:icccm:-GetProperty-text (xcb:icccm:-GetProperty)
+ ((type :initform 'xcb:GetPropertyType:Any))
+ :documentation "Get an ICCCM text property (request part).")
+
+(defclass xcb:icccm:-GetProperty-text~reply (xcb:icccm:-GetProperty~reply)
+ nil
+ :documentation "Get an ICCCM text property (reply part).")
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:-GetProperty-text~reply)
+ byte-array)
+ "Fill in the fields in the reply of ICCCM GetProperty (text) request OBJ
+according to BYTE-ARRAY.
+
+This method automatically decodes the value (as string)."
+ (let* ((retval (cl-call-next-method obj byte-array)))
+ (with-slots (format type value) obj
+ (when (symbolp type) (setq type (symbol-value type)))
+ (when (and value (= format 8))
+ (setf value
+ (decode-coding-string
+ (apply #'unibyte-string (append value nil))
+ (cond ((= type xcb:Atom:UTF8_STRING) 'utf-8)
+ ((= type xcb:Atom:STRING) 'iso-latin-1)
+ ((= type xcb:Atom:COMPOUND_TEXT)
+ 'compound-text-with-extensions)
+ ((or (eq type xcb:Atom:TEXT) (eq type xcb:Atom:C_STRING))
+ 'no-conversion)
+ (t (error "[XELB:ICCCM] Unsupported encoding: %d"
+ type)))))))
+ retval))
+
+(defclass xcb:icccm:-ChangeProperty-text (xcb:icccm:-ChangeProperty)
+ ((type :initform 'xcb:Atom:STRING) ;may be changed
+ (format :initform 8))
+ :documentation "Change an ICCCM text property.")
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty-text))
+ "Return the byte-array representation of an ICCCM ChangeProperty (text)
+request OBJ.
+
+This method automatically encodes the data (which is a string)."
+ (with-slots (type data) obj
+ (when (symbolp type) (setq type (symbol-value type)))
+ (setf data
+ (vconcat
+ (encode-coding-string
+ data
+ (cond ((= type xcb:Atom:UTF8_STRING) 'utf-8)
+ ((= type xcb:Atom:STRING) 'iso-latin-1)
+ ((= type xcb:Atom:COMPOUND_TEXT)
+ 'compound-text-with-extensions)
+ ((or (eq type xcb:Atom:TEXT) (eq type xcb:Atom:C_STRING))
+ 'no-conversion)
+ (t (error "[XELB:ICCCM] Unsupported encoding: %d" type)))))))
+ (cl-call-next-method obj))
+
+;;;; Abstract classes for getting/changing single field properties
+
+(defclass xcb:icccm:-GetProperty-single (xcb:icccm:-GetProperty)
+ nil
+ :documentation "Get an ICCCM single-valued property (request part).")
+
+(defclass xcb:icccm:-GetProperty-single~reply (xcb:icccm:-GetProperty~reply)
+ nil
+ :documentation "Get a single-valued ICCCM property (reply part).")
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:-GetProperty-single~reply)
+ byte-array)
+ "Fill in the fields in the reply of an ICCCM GetProperty (single-valued)
+request OBJ according to BYTE-ARRAY."
+ (let ((retval (cl-call-next-method obj byte-array)))
+ (with-slots (value) obj
+ (when value
+ (cl-assert (= 1 (length value)))
+ (setf value (elt value 0))))
+ retval))
+
+(defclass xcb:icccm:-ChangeProperty-single (xcb:icccm:-ChangeProperty)
+ nil
+ :documentation "Change a single-valued ICCCM property.")
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty-single))
+ "Return the byte-array representation of a single-valued ICCCM ChangeProperty
+request OBJ."
+ (with-slots (data) obj
+ (setf data `[,data]))
+ (cl-call-next-method obj))
+
+;;;; Abstract classes for getting/changing property with explicit fields
+
+(defclass xcb:icccm:-GetProperty-explicit (xcb:icccm:-GetProperty)
+ nil
+ :documentation "Get an ICCCM property whose fields are explicitly listed out
+(request part).")
+
+(defclass xcb:icccm:-GetProperty-explicit~reply (xcb:icccm:-GetProperty~reply)
+ nil
+ :documentation "Get an ICCCM property whose fields are explicitly listed out
+(reply part).")
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:-GetProperty-explicit~reply)
+ byte-array)
+ "Fill in the reply of an ICCCM GetProperty request whose fields are
+explicitly listed out."
+ (let* ((retval (cl-call-next-method obj byte-array))
+ (slots-orig (eieio-class-slots 'xcb:icccm:-GetProperty~reply))
+ (slots (eieio-class-slots (eieio-object-class obj)))
+ (slots (nthcdr (length slots-orig) slots))
+ (value (slot-value obj 'value)))
+ (unless value (setq value (make-vector (length slots) nil))) ;fallback
+ ;; Set explicit fields from value field
+ (dotimes (i (length value))
+ (setf (slot-value obj (eieio-slot-descriptor-name (elt slots i)))
+ (elt value i)))
+ retval))
+
+(defclass xcb:icccm:-ChangeProperty-explicit (xcb:icccm:-ChangeProperty)
+ ((format :initform 32))
+ :documentation "Change an ICCCM property whose fields are explicitly listed
+out.")
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:-ChangeProperty-explicit))
+ "Return the byte-array representation of an ICCCM ChangeProperty request
+whose fields are explicitly listed out."
+ (let* ((slots-orig (eieio-class-slots 'xcb:icccm:-ChangeProperty))
+ (slots (eieio-class-slots (eieio-object-class obj)))
+ (slots (nthcdr (length slots-orig) slots)))
+ ;; Set data field from explicit fields
+ (setf (slot-value obj 'data)
+ (mapconcat (lambda (slot)
+ (list (slot-value obj
+ (eieio-slot-descriptor-name slot))))
+ slots []))
+ (cl-call-next-method obj)))
+
+;;;; Client Properties
+
+;; WM_NAME
+(defclass xcb:icccm:get-WM_NAME (xcb:icccm:-GetProperty-text)
+ ((property :initform 'xcb:Atom:WM_NAME)))
+(defclass xcb:icccm:get-WM_NAME~reply (xcb:icccm:-GetProperty-text~reply)
+ nil)
+(defclass xcb:icccm:set-WM_NAME (xcb:icccm:-ChangeProperty-text)
+ ((property :initform 'xcb:Atom:WM_NAME)))
+
+;; WM_ICON_NAME
+(defclass xcb:icccm:get-WM_ICON_NAME (xcb:icccm:-GetProperty-text)
+ ((property :initform 'xcb:Atom:WM_ICON_NAME)))
+(defclass xcb:icccm:get-WM_ICON_NAME~reply (xcb:icccm:-GetProperty-text~reply)
+ nil)
+(defclass xcb:icccm:set-WM_ICON_NAME (xcb:icccm:-ChangeProperty-text)
+ ((property :initform 'xcb:Atom:WM_ICON_NAME)))
+
+;; WM_SIZE_HINTS
+(defconst xcb:icccm:WM_SIZE_HINTS:USPosition 1)
+(defconst xcb:icccm:WM_SIZE_HINTS:USSize 2)
+(defconst xcb:icccm:WM_SIZE_HINTS:PPosition 4)
+(defconst xcb:icccm:WM_SIZE_HINTS:PSize 8)
+(defconst xcb:icccm:WM_SIZE_HINTS:PMinSize 16)
+(defconst xcb:icccm:WM_SIZE_HINTS:PMaxSize 32)
+(defconst xcb:icccm:WM_SIZE_HINTS:PResizeInc 64)
+(defconst xcb:icccm:WM_SIZE_HINTS:PAspect 128)
+(defconst xcb:icccm:WM_SIZE_HINTS:PBaseSize 256)
+(defconst xcb:icccm:WM_SIZE_HINTS:PWinGravity 512)
+;;
+(defclass xcb:icccm:-WM_SIZE_HINTS (xcb:--struct)
+ ((flags :initarg :flags :initform 0 :type xcb:-ignore)
+ (x :initarg :x :initform 0 :type xcb:-ignore)
+ (y :initarg :y :initform 0 :type xcb:-ignore)
+ (width :initarg :width :initform 0 :type xcb:-ignore)
+ (height :initarg :height :initform 0 :type xcb:-ignore)
+ (min-width :initarg :min-width :initform 0 :type xcb:-ignore)
+ (min-height :initarg :min-height :initform 0 :type xcb:-ignore)
+ (max-width :initarg :max-width :initform 0 :type xcb:-ignore)
+ (max-height :initarg :max-height :initform 0 :type xcb:-ignore)
+ (width-inc :initarg :width-inc :initform 0 :type xcb:-ignore)
+ (height-inc :initarg :height-inc :initform 0 :type xcb:-ignore)
+ (min-aspect-num :initarg :min-aspect-num :initform 0 :type xcb:-ignore)
+ (min-aspect-den :initarg :min-aspect-den :initform 0 :type xcb:-ignore)
+ (max-aspect-num :initarg :max-aspect-num :initform 0 :type xcb:-ignore)
+ (max-aspect-den :initarg :max-aspect-den :initform 0 :type xcb:-ignore)
+ (base-width :initarg :base-width :initform 0 :type xcb:-ignore)
+ (base-height :initarg :base-height :initform 0 :type xcb:-ignore)
+ (win-gravity :initarg :win-gravity :initform 0 :type xcb:-ignore)))
+;;
+(defclass xcb:icccm:get-WM_SIZE_HINTS (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:WM_SIZE_HINTS)
+ (type :initform 'xcb:Atom:WM_SIZE_HINTS)
+ (long-length :initform 18))) ;fixed
+(defclass xcb:icccm:get-WM_SIZE_HINTS~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:icccm:-WM_SIZE_HINTS)
+ nil)
+(defclass xcb:icccm:set-WM_SIZE_HINTS
+ (xcb:icccm:-ChangeProperty-explicit xcb:icccm:-WM_SIZE_HINTS)
+ ((property :initform 'xcb:Atom:WM_SIZE_HINTS)
+ (type :initform 'xcb:Atom:WM_SIZE_HINTS)))
+
+;; WM_NORMAL_HINTS
+(defclass xcb:icccm:get-WM_NORMAL_HINTS (xcb:icccm:get-WM_SIZE_HINTS)
+ ((property :initform 'xcb:Atom:WM_NORMAL_HINTS)))
+(defclass xcb:icccm:get-WM_NORMAL_HINTS~reply
+ (xcb:icccm:get-WM_SIZE_HINTS~reply)
+ nil)
+(defclass xcb:icccm:set-WM_NORMAL_HINTS (xcb:icccm:set-WM_SIZE_HINTS)
+ ((property :initform 'xcb:Atom:WM_NORMAL_HINTS)))
+
+;; WM_HINTS
+(defconst xcb:icccm:WM_HINTS:InputHint 1)
+(defconst xcb:icccm:WM_HINTS:StateHint 2)
+(defconst xcb:icccm:WM_HINTS:IconPixmapHint 4)
+(defconst xcb:icccm:WM_HINTS:IconWindowHint 8)
+(defconst xcb:icccm:WM_HINTS:IconPositionHint 16)
+(defconst xcb:icccm:WM_HINTS:IconMaskHint 32)
+(defconst xcb:icccm:WM_HINTS:WindowGroupHint 64)
+(defconst xcb:icccm:WM_HINTS:MessageHint 128)
+(defconst xcb:icccm:WM_HINTS:UrgencyHint 256)
+;;
+(defclass xcb:icccm:-WM_HINTS (xcb:--struct)
+ ((flags :initarg :flags :initform 0 :type xcb:-ignore)
+ (input :initarg :input :initform 0 :type xcb:-ignore)
+ (initial-state :initarg :initial-state :initform 0 :type xcb:-ignore)
+ (icon-pixmap :initarg :icon-pixmap :initform 0 :type xcb:-ignore)
+ (icon-window :initarg :icon-window :initform 0 :type xcb:-ignore)
+ (icon-x :initarg :icon-x :initform 0 :type xcb:-ignore)
+ (icon-y :initarg :icon-y :initform 0 :type xcb:-ignore)
+ (icon-mask :initarg :icon-mask :initform 0 :type xcb:-ignore)
+ (window-group :initarg :window-group :initform 0 :type xcb:-ignore)))
+;;
+(defclass xcb:icccm:get-WM_HINTS (xcb:icccm:-GetProperty-explicit)
+ ;; (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:WM_HINTS)
+ (type :initform 'xcb:Atom:WM_HINTS)
+ (long-length :initform 9))) ;fixed
+(defclass xcb:icccm:get-WM_HINTS~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:icccm:-WM_HINTS)
+ nil)
+(defclass xcb:icccm:set-WM_HINTS
+ (xcb:icccm:-ChangeProperty-explicit xcb:icccm:-WM_HINTS)
+ ((property :initform 'xcb:Atom:WM_HINTS)
+ (type :initform 'xcb:Atom:WM_HINTS)))
+
+;; WM_CLASS
+(defclass xcb:icccm:get-WM_CLASS (xcb:icccm:-GetProperty-text)
+ ((property :initform 'xcb:Atom:WM_CLASS)
+ (type :initform 'xcb:Atom:STRING)))
+(defclass xcb:icccm:get-WM_CLASS~reply (xcb:icccm:-GetProperty-text~reply)
+ ((instance-name :type xcb:-ignore)
+ (class-name :type xcb:-ignore)))
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:icccm:get-WM_CLASS~reply) byte-array)
+ ;; Split value into instance & class names
+ (let* ((retval (cl-call-next-method obj byte-array))
+ (tmp (slot-value obj 'value))
+ (tmp (if tmp (split-string tmp "\0" t) '(nil nil))))
+ (with-slots (instance-name class-name) obj
+ (setf instance-name (car tmp)
+ class-name (cadr tmp)))
+ retval))
+;;
+(defclass xcb:icccm:set-WM_CLASS (xcb:icccm:-ChangeProperty-text)
+ ((property :initform 'xcb:Atom:WM_CLASS)
+ (type :initform 'xcb:Atom:STRING)
+ (instance-name :initarg :instance-name :type xcb:-ignore)
+ (class-name :initarg :class-name :type xcb:-ignore)))
+;;
+(cl-defmethod xcb:marshal ((obj xcb:icccm:set-WM_CLASS))
+ (with-slots (data instance-name class-name) obj
+ (setf data (concat instance-name "\0" class-name "\0")))
+ (cl-call-next-method obj))
+
+;; WM_TRANSIENT_FOR
+(defclass xcb:icccm:get-WM_TRANSIENT_FOR (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:WM_TRANSIENT_FOR)
+ (type :initform 'xcb:Atom:WINDOW)
+ (long-length :initform 1)))
+(defclass xcb:icccm:get-WM_TRANSIENT_FOR~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:icccm:set-WM_TRANSIENT_FOR (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:WM_TRANSIENT_FOR)
+ (type :initform 'xcb:Atom:WINDOW)))
+
+;; WM_PROTOCOLS
+(defclass xcb:icccm:get-WM_PROTOCOLS (xcb:icccm:-GetProperty)
+ ((property :initform 'xcb:Atom:WM_PROTOCOLS)
+ (type :initform 'xcb:Atom:ATOM)))
+(defclass xcb:icccm:get-WM_PROTOCOLS~reply (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:icccm:set-WM_PROTOCOLS (xcb:icccm:-ChangeProperty)
+ ((type :initform 'xcb:Atom:ATOM)
+ (format :initform 32)))
+
+;; WM_COLORMAP_WINDOWS
+(defclass xcb:icccm:get-WM_COLORMAP_WINDOWS (xcb:icccm:-GetProperty)
+ ((type :initform 'xcb:Atom:WINDOW)))
+(defclass xcb:icccm:get-WM_COLORMAP_WINDOWS~reply
+ (xcb:icccm:-GetProperty~reply)
+ nil)
+(defclass xcb:icccm:set-WM_COLORMAP_WINDOWS (xcb:icccm:-ChangeProperty)
+ ((type :initform 'xcb:Atom:WINDOW)
+ (format :initform 32)))
+
+;; WM_CLIENT_MACHINE
+(defclass xcb:icccm:get-WM_CLIENT_MACHINE (xcb:icccm:-GetProperty-text)
+ ((property :initform 'xcb:Atom:WM_CLIENT_MACHINE)))
+(defclass xcb:icccm:get-WM_CLIENT_MACHINE~reply
+ (xcb:icccm:-GetProperty-text~reply)
+ nil)
+(defclass xcb:icccm:set-WM_CLIENT_MACHINE (xcb:icccm:-ChangeProperty-text)
+ ((property :initform 'xcb:Atom:WM_CLIENT_MACHINE)))
+
+;;;; Window Manager Properties
+
+;; WM_STATE
+(defconst xcb:icccm:WM_STATE:WithdrawnState 0)
+(defconst xcb:icccm:WM_STATE:NormalState 1)
+(defconst xcb:icccm:WM_STATE:IconicState 3)
+;;
+(defclass xcb:icccm:-WM_STATE (xcb:--struct)
+ ((state :initarg :state :type xcb:-ignore)
+ (icon :initarg :icon :type xcb:-ignore)))
+;;
+(defclass xcb:icccm:get-WM_STATE (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:WM_STATE)
+ (type :initform 'xcb:Atom:WM_STATE)
+ (long-length :initform 2)))
+(defclass xcb:icccm:get-WM_STATE~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:icccm:-WM_STATE)
+ nil)
+(defclass xcb:icccm:set-WM_STATE
+ (xcb:icccm:-ChangeProperty-explicit xcb:icccm:-WM_STATE)
+ ((property :initform 'xcb:Atom:WM_STATE)
+ (type :initform 'xcb:Atom:WM_STATE)))
+
+;; WM_ICON_SIZE
+(defclass xcb:icccm:-WM_ICON_SIZE (xcb:--struct)
+ ((min-width :initarg :min-width :type xcb:-ignore)
+ (min-height :initarg :min-height :type xcb:-ignore)
+ (max-width :initarg :max-width :type xcb:-ignore)
+ (max-height :initarg :max-height :type xcb:-ignore)
+ (width-inc :initarg :width-inc :type xcb:-ignore)
+ (height-inc :initarg :height-inc :type xcb:-ignore)))
+;;
+(defclass xcb:icccm:get-WM_ICON_SIZE (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:WM_ICON_SIZE)
+ (type :initform 'xcb:Atom:WM_ICON_SIZE)
+ (long-length :initform 6)))
+(defclass xcb:icccm:get-WM_ICON_SIZE~reply
+ (xcb:icccm:-GetProperty-explicit~reply xcb:icccm:-WM_ICON_SIZE)
+ nil)
+(defclass xcb:icccm:set-WM_ICON_SIZE
+ (xcb:icccm:-ChangeProperty-explicit xcb:icccm:-WM_ICON_SIZE)
+ ((property :initform 'xcb:Atom:WM_ICON_SIZE)
+ (type :initform 'xcb:Atom:WM_ICON_SIZE)))
+
+
+
+(provide 'xcb-icccm)
+
+;;; xcb-icccm.el ends here
diff --git a/elpa/xelb-0.20/xcb-icccm.elc b/elpa/xelb-0.20/xcb-icccm.elc
new file mode 100644
index 0000000..60b68b5
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-icccm.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-keysyms.el b/elpa/xelb-0.20/xcb-keysyms.el
new file mode 100644
index 0000000..8999d71
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-keysyms.el
@@ -0,0 +1,813 @@
+;;; xcb-keysyms.el --- Conversion between -*- lexical-binding: t -*-
+;;; X keysyms, X keycodes and Emacs key event.
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library mainly deals with the conversion between X keycodes, X keysyms
+;; and Emacs key events, roughly corresponding to the xcb/util-keysyms project.
+
+;; Usage tips:
+;; + Do not forget to call `xcb:keysyms:init' for _every_ connection using
+;; this library.
+;; + xcb:keysyms:*-mask correctly relate Emacs modifier keys to X ones,
+;; thus shall be used in preference to 'xcb:ModMask:*' or
+;; 'xcb:KeyButMask:Mod*'.
+
+;; References:
+;; + X protocol (http://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.txt)
+;; + XKB protocol (https://www.x.org/releases/X11R7.7/doc/kbproto/xkbproto.txt)
+;; + xcb/util-keysyms (git://anongit.freedesktop.org/xcb/util-keysyms)
+
+;;; Code:
+
+(require 'cl-lib)
+
+(require 'xcb)
+(require 'xcb-xkb)
+
+(defclass xcb:keysyms:-device (xcb:--struct)
+ ((keytypes :initform nil)
+ (keycodes :initform nil)
+ (min-keycode :initform 0)
+ (max-keycode :initform 0)
+ (updated :initform nil))
+ :documentation "Device (keyboard) properties.")
+
+;; These variables are shared by all connections.
+(defvar xcb:keysyms:meta-mask 0 "META key mask.")
+(defvar xcb:keysyms:control-mask xcb:ModMask:Control "CONTROL key mask.")
+(defvar xcb:keysyms:shift-mask xcb:ModMask:Shift "SHIFT key mask.")
+(defvar xcb:keysyms:hyper-mask 0 "HYPER key mask.")
+(defvar xcb:keysyms:super-mask 0 "SUPER key mask.")
+(defvar xcb:keysyms:alt-mask 0 "ALT key mask.")
+(defvar xcb:keysyms:lock-mask xcb:ModMask:Lock "LOCK key mask.")
+(defvar xcb:keysyms:shift-lock-mask 0 "SHIFT-LOCK key mask.")
+(defvar xcb:keysyms:num-lock-mask 0 "NUM-LOCK key mask.")
+
+(cl-defmethod xcb:keysyms:-get-current-device ((conn xcb:connection))
+ "Return the device currently used."
+ (or (xcb:-get-extra-plist conn 'keysyms
+ (xcb:-get-extra-plist conn 'keysyms 'device-id))
+ (make-instance 'xcb:keysyms:-device)))
+
+(cl-defmethod xcb:keysyms:init ((obj xcb:connection) &optional callback)
+ "Initialize keysyms module.
+
+CALLBACK specifies a function to call every time the keyboard is updated.
+
+This method must be called before using any other method in this module."
+ (cond
+ ;; Avoid duplicated initializations.
+ ((xcb:-get-extra-plist obj 'keysyms 'opcode))
+ ((= 0 (slot-value (xcb:get-extension-data obj 'xcb:xkb)
+ 'present))
+ (error "[XCB] XKB extension is not supported by the server"))
+ ((not (slot-value (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:xkb:UseExtension
+ :wantedMajor 1
+ :wantedMinor 0))
+ 'supported))
+ (error "[XCB] XKB extension version 1.0 is not supported by the server"))
+ (t
+ ;; Save the major opcode of XKB and callback function.
+ (xcb:-set-extra-plist obj 'keysyms 'opcode
+ (slot-value (xcb:get-extension-data obj 'xcb:xkb)
+ 'major-opcode))
+ (xcb:-set-extra-plist obj 'keysyms 'callback callback)
+ ;; Set per-client flags.
+ (xcb:keysyms:-set-per-client-flags obj xcb:xkb:ID:UseCoreKbd)
+ ;; Update data.
+ (xcb:keysyms:-update-keytypes obj xcb:xkb:ID:UseCoreKbd)
+ (xcb:-set-extra-plist obj 'keysyms 'device-id
+ (xcb:keysyms:-update-keycodes obj
+ xcb:xkb:ID:UseCoreKbd))
+ (xcb:keysyms:-update-modkeys obj xcb:xkb:ID:UseCoreKbd)
+ ;; Attach event listeners.
+ (xcb:+event obj 'xcb:xkb:NewKeyboardNotify
+ (lambda (data _)
+ (xcb:keysyms:-on-NewKeyboardNotify obj data)))
+ (xcb:+event obj 'xcb:xkb:MapNotify
+ (lambda (data _)
+ (xcb:keysyms:-on-MapNotify obj data)))
+ ;; Select XKB MapNotify and NewKeyboardNotify events.
+ (let ((map (logior xcb:xkb:MapPart:KeyTypes
+ xcb:xkb:MapPart:KeySyms
+ xcb:xkb:MapPart:ModifierMap))
+ (new-keyboard (logior xcb:xkb:NKNDetail:DeviceID
+ xcb:xkb:NKNDetail:Keycodes)))
+ (xcb:+request obj
+ (make-instance 'xcb:xkb:SelectEvents
+ :deviceSpec xcb:xkb:ID:UseCoreKbd
+ :affectWhich (logior
+ xcb:xkb:EventType:NewKeyboardNotify
+ xcb:xkb:EventType:MapNotify)
+ :clear 0
+ :selectAll 0
+ :affectMap map
+ :map map
+ :affectNewKeyboard new-keyboard
+ :newKeyboardDetails new-keyboard)))
+ (xcb:flush obj))))
+
+(cl-defmethod xcb:keysyms:-set-per-client-flags ((obj xcb:connection)
+ device-id)
+ "Set per-client flags."
+ (let ((per-client-flags (logior
+ ;; Instead of compatibility state.
+ xcb:xkb:PerClientFlag:GrabsUseXKBState
+ ;; Instead of grab state.
+ xcb:xkb:PerClientFlag:LookupStateWhenGrabbed
+ ;; Use XKB state in 'SendEvent'.
+ xcb:xkb:PerClientFlag:SendEventUsesXKBState)))
+ ;; The reply is not used.
+ (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:xkb:PerClientFlags
+ :deviceSpec device-id
+ :change per-client-flags
+ :value per-client-flags
+ :ctrlsToChange 0
+ :autoCtrls 0
+ :autoCtrlsValues 0))))
+
+(cl-defmethod xcb:keysyms:-on-NewKeyboardNotify ((obj xcb:connection) data)
+ "Handle a \\='NewKeyboardNotify' event."
+ (let ((device-id (xcb:-get-extra-plist obj 'keysyms 'device-id))
+ (callback (xcb:-get-extra-plist obj 'keysyms 'callback))
+ (obj1 (make-instance 'xcb:xkb:NewKeyboardNotify))
+ device updated)
+ (xcb:unmarshal obj1 data)
+ (with-slots (deviceID oldDeviceID requestMajor requestMinor changed) obj1
+ (if (= 0 (logand changed xcb:xkb:NKNDetail:DeviceID))
+ (when (/= 0 (logand changed xcb:xkb:NKNDetail:Keycodes))
+ (setq device (xcb:-get-extra-plist obj 'keysyms deviceID))
+ (when (and device
+ (not (slot-value device 'updated)))
+ (xcb:keysyms:-update-keycodes obj deviceID)
+ (when (= deviceID device-id)
+ (setq updated t)
+ (xcb:keysyms:-update-modkeys obj deviceID))
+ (setf (slot-value device 'updated) t)))
+ (xcb:keysyms:-set-per-client-flags obj deviceID)
+ (xcb:keysyms:-update-keytypes obj deviceID)
+ (xcb:keysyms:-update-keycodes obj deviceID)
+ (when (or (= oldDeviceID device-id)
+ ;; 0 is a special value for servers not supporting
+ ;; the X Input Extension.
+ (= oldDeviceID 0))
+ ;; Device changed; update the per-client flags and local data.
+ (setq updated t)
+ (xcb:keysyms:-update-modkeys obj deviceID)
+ (xcb:-set-extra-plist obj 'keysyms 'device-id deviceID))))
+ (when (and callback updated)
+ (with-demoted-errors "[XELB ERROR] %S"
+ (funcall callback)))))
+
+(cl-defmethod xcb:keysyms:-on-MapNotify ((obj xcb:connection) data)
+ "Handle \\='MapNotify' event."
+ (let ((device-id (xcb:-get-extra-plist obj 'keysyms 'device-id))
+ (callback (xcb:-get-extra-plist obj 'keysyms 'callback))
+ (obj1 (make-instance 'xcb:xkb:MapNotify))
+ updated)
+ (xcb:unmarshal obj1 data)
+ (with-slots (deviceID changed firstType nTypes firstKeySym nKeySyms) obj1
+ ;; Ensure this event is for the current device.
+ (when (/= 0 (logand changed xcb:xkb:MapPart:KeyTypes))
+ (setq updated t)
+ (xcb:keysyms:-update-keytypes obj deviceID firstType nTypes))
+ (when (/= 0 (logand changed xcb:xkb:MapPart:KeySyms))
+ (setq updated t)
+ (xcb:keysyms:-update-keycodes obj deviceID firstKeySym nKeySyms))
+ (when (/= 0 (logand changed xcb:xkb:MapPart:ModifierMap))
+ (setq updated t)
+ (xcb:keysyms:-update-modkeys obj deviceID))
+ (when (and updated
+ callback
+ (= deviceID device-id))
+ (with-demoted-errors "[XELB ERROR] %S"
+ (funcall callback))))))
+
+(cl-defmethod xcb:keysyms:-update-keytypes ((obj xcb:connection) device-id
+ &optional first-keytype count)
+ "Update key types.
+
+FIRST-KEYTYPE and count specify the range of key types to update."
+ (let (device full partial)
+ (if (and first-keytype count)
+ (setq full 0
+ partial xcb:xkb:MapPart:KeyTypes)
+ (setq full xcb:xkb:MapPart:KeyTypes
+ partial 0
+ first-keytype 0
+ count 0))
+ (with-slots (deviceID present firstType nTypes totalTypes types-rtrn)
+ (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:xkb:GetMap
+ :deviceSpec device-id
+ :full full
+ :partial partial
+ :firstType first-keytype
+ :nTypes count
+ :firstKeySym 0
+ :nKeySyms 0
+ :firstKeyAction 0
+ :nKeyActions 0
+ :firstKeyBehavior 0
+ :nKeyBehaviors 0
+ :virtualMods 0
+ :firstKeyExplicit 0
+ :nKeyExplicit 0
+ :firstModMapKey 0
+ :nModMapKeys 0
+ :firstVModMapKey 0
+ :nVModMapKeys 0))
+ (cl-assert (/= 0 (logand present xcb:xkb:MapPart:KeyTypes)))
+ (setq device (or (xcb:-get-extra-plist obj 'keysyms deviceID)
+ (make-instance 'xcb:keysyms:-device)))
+ (with-slots (keytypes) device
+ (when (or (/= 0 full)
+ (not keytypes))
+ (setf keytypes (make-vector totalTypes nil)))
+ (setf keytypes (vconcat (substring keytypes 0 firstType)
+ types-rtrn
+ (substring keytypes (min (+ firstType nTypes)
+ totalTypes)))))
+ (xcb:-set-extra-plist obj 'keysyms deviceID device)
+ deviceID)))
+
+(cl-defmethod xcb:keysyms:-update-keycodes ((obj xcb:connection) device-id
+ &optional first-keycode count)
+ "Update keycode-keysym mapping.
+
+FIRST-KEYCODE and COUNT specify the keycode range to update."
+ (let (device full partial)
+ (if (and first-keycode count)
+ (setq full 0
+ partial xcb:xkb:MapPart:KeySyms)
+ (setq full xcb:xkb:MapPart:KeySyms
+ partial 0
+ first-keycode 0
+ count 0))
+ (with-slots (deviceID minKeyCode maxKeyCode present
+ firstKeySym nKeySyms syms-rtrn)
+ (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:xkb:GetMap
+ :deviceSpec device-id
+ :full full
+ :partial partial
+ :firstType 0
+ :nTypes 0
+ :firstKeySym first-keycode
+ :nKeySyms count
+ :firstKeyAction 0
+ :nKeyActions 0
+ :firstKeyBehavior 0
+ :nKeyBehaviors 0
+ :virtualMods 0
+ :firstKeyExplicit 0
+ :nKeyExplicit 0
+ :firstModMapKey 0
+ :nModMapKeys 0
+ :firstVModMapKey 0
+ :nVModMapKeys 0))
+ (cl-assert (/= 0 (logand present xcb:xkb:MapPart:KeySyms)))
+ (setq device (or (xcb:-get-extra-plist obj 'keysyms deviceID)
+ (make-instance 'xcb:keysyms:-device)))
+ (with-slots (keycodes min-keycode max-keycode) device
+ (when (or (/= 0 full)
+ ;; Unlikely?
+ (/= min-keycode minKeyCode)
+ (/= max-keycode maxKeyCode))
+ (setf keycodes (make-vector (- maxKeyCode minKeyCode -1) nil)
+ min-keycode minKeyCode
+ max-keycode maxKeyCode))
+ (setf keycodes
+ (vconcat
+ (substring keycodes 0 (- firstKeySym min-keycode))
+ syms-rtrn
+ (substring keycodes
+ (- (min (+ firstKeySym nKeySyms) max-keycode)
+ min-keycode)))))
+ (xcb:-set-extra-plist obj 'keysyms deviceID device)
+ deviceID)))
+
+(cl-defmethod xcb:keysyms:-update-modkeys ((obj xcb:connection) _device-id)
+ "Update modifier keys."
+ ;; Reference: 'x_find_modifier_meanings' in 'xterm.c'.
+ (with-slots (keycodes-per-modifier keycodes)
+ (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:GetModifierMapping))
+ (setq xcb:keysyms:meta-mask 0
+ xcb:keysyms:hyper-mask 0
+ xcb:keysyms:super-mask 0
+ xcb:keysyms:alt-mask 0
+ xcb:keysyms:shift-lock-mask 0
+ xcb:keysyms:num-lock-mask 0)
+ (dolist (row (number-sequence 3 7))
+ (let ((mask (ash 1 row))
+ (col 0)
+ found-alt-or-meta keycode keysym)
+ (while (< col keycodes-per-modifier)
+ (setq keycode (elt keycodes (+ (* row keycodes-per-modifier) col)))
+ (when (/= keycode 0)
+ (setq keysym (car (xcb:keysyms:keycode->keysym obj keycode 0)))
+ (when (/= keysym 0)
+ (pcase (xcb:keysyms:keysym->event obj keysym nil t)
+ ((or `lmeta* `rmeta*)
+ (setq found-alt-or-meta t
+ xcb:keysyms:meta-mask (logior xcb:keysyms:meta-mask
+ mask)))
+ ((or `lalt* `ralt*)
+ (setq found-alt-or-meta t
+ xcb:keysyms:alt-mask (logior xcb:keysyms:alt-mask
+ mask)))
+ ((or `lhyper* `rhyper*)
+ (unless found-alt-or-meta
+ (setq xcb:keysyms:hyper-mask (logior xcb:keysyms:hyper-mask
+ mask)))
+ (setq col keycodes-per-modifier))
+ ((or `lsuper* `rsuper*)
+ (unless found-alt-or-meta
+ (setq xcb:keysyms:super-mask (logior xcb:keysyms:super-mask
+ mask)))
+ (setq col keycodes-per-modifier))
+ (`shift-lock*
+ (unless found-alt-or-meta
+ (setq xcb:keysyms:lock-mask (logior xcb:keysyms:lock-mask
+ mask)))
+ (setq col keycodes-per-modifier))
+ (`kp-numlock
+ (setq xcb:keysyms:num-lock-mask
+ (logior xcb:keysyms:num-lock-mask mask))))))
+ (cl-incf col)))))
+ ;; Meta fallbacks to Alt.
+ (unless (/= 0 xcb:keysyms:meta-mask)
+ (setq xcb:keysyms:meta-mask xcb:keysyms:alt-mask
+ xcb:keysyms:alt-mask 0))
+ ;; A key cannot be both Meta and Alt.
+ (when (and (/= 0 xcb:keysyms:meta-mask)
+ (/= 0 xcb:keysyms:alt-mask)
+ (/= 0 (logand xcb:keysyms:meta-mask xcb:keysyms:alt-mask)))
+ (setq xcb:keysyms:alt-mask (logand xcb:keysyms:alt-mask
+ (lognot xcb:keysyms:meta-mask)))))
+
+(cl-defmethod xcb:keysyms:keycode->keysym ((obj xcb:connection) keycode
+ modifiers)
+ "Convert KEYCODE to keysym or get possible modifier combinations for keycode.
+
+If MODIFIERS is non-nil, return (KEYSYM . CONSUMED-MODIFIERS) where
+CONSUMED-MODIFIERS should be lognot'ed with MODIFIERS so as to make further
+conversion correct. (0 . 0) is returned when conversion fails.
+
+If MODIFIERS is nil, return all possible modifier combinations for this
+keycode. The caller is responsible for checking which modifiers to use."
+ (let ((preserve 0)
+ group group-info group-number index keytype)
+ (with-slots (keytypes keycodes min-keycode max-keycode)
+ (xcb:keysyms:-get-current-device obj)
+ ;; Reference: `XkbTranslateKeyCode' in 'XKBBind.c'.
+ (catch 'return
+ ;; Check keycode range.
+ (unless (<= min-keycode keycode max-keycode)
+ (throw 'return '(0 . 0)))
+ ;; Retrieve KeySymMap and group info.
+ (setq keycode (aref keycodes (- keycode min-keycode))
+ group-info (slot-value keycode 'groupInfo)
+ group-number (logand group-info #xF)) ; See <XKBstr.h>.
+ ;; Check group number.
+ (when (= group-number 0)
+ (throw 'return '(0 . 0)))
+ (setq group (if (null modifiers)
+ 0
+ (logand (ash modifiers -13) #b11))) ;The 13, 14 bits.
+ ;; Wrap group.
+ (when (>= group group-number)
+ (pcase (logand group-info #xC0) ;See <XKBstr.h>.
+ (`xcb:xkb:GroupsWrap:RedirectIntoRange
+ (setq group (logand #xFF (ash group-info -4))) ;See <XKBstr.h>.
+ ;; Check if it's also out of range.
+ (when (>= group group-number)
+ (setq group 0)))
+ (`xcb:xkb:GroupsWrap:ClampIntoRange
+ (setq group (1- group-number)))
+ (_
+ (setq group (% group group-number)))))
+ ;; Calculate the index of keysym.
+ (setq index (* group (slot-value keycode 'width)))
+ ;; Get key type.
+ (setq keytype (aref keytypes
+ (elt (slot-value keycode 'kt-index) group)))
+ (with-slots (mods-mask hasPreserve map (preserve* preserve)) keytype
+ (if (null modifiers)
+ ;; Return all possible modifier combinations.
+ (delq nil
+ (mapcar (lambda (entry)
+ (when (= (slot-value entry 'active) 1)
+ (slot-value entry 'mods-mask)))
+ map))
+ ;; Find the shift level and preserved modifiers.
+ (catch 'break
+ (dolist (entry map)
+ (with-slots (active (mods-mask* mods-mask) level) entry
+ (when (and (= 1 active)
+ (= (logand modifiers mods-mask) mods-mask*))
+ (cl-incf index level)
+ (when (= 1 hasPreserve)
+ (setq preserve (slot-value (elt preserve*
+ (cl-position entry map))
+ 'mask)))
+ (throw 'break nil)))))
+ (cons (elt (slot-value keycode 'syms) index)
+ (logand mods-mask (lognot preserve)))))))))
+
+(cl-defmethod xcb:keysyms:keysym->keycode ((obj xcb:connection) keysym)
+ "Convert keysym to (the first matching) keycode.
+
+Return 0 if conversion fails."
+ (let ((index 0)
+ (continue t))
+ (with-slots (keycodes min-keycode max-keycode)
+ (xcb:keysyms:-get-current-device obj)
+ ;; Traverse all keycodes, column by column.
+ ;; Reference: `XKeysymToKeycode' in 'XKBBind.c'.
+ (catch 'break
+ (when (= 0 keysym)
+ (throw 'break 0))
+ (while continue
+ (setq continue nil)
+ (dotimes (i (- max-keycode min-keycode -1))
+ (with-slots (nSyms syms) (aref keycodes i)
+ (when (< index nSyms)
+ (setq continue t)
+ (when (= keysym (elt syms index))
+ (throw 'break (+ i min-keycode))))))
+ (cl-incf index))
+ 0))))
+
+;; This list is largely base on 'lispy_function_keys' in 'keyboard.c'.
+(defconst xcb:keysyms:-function-keys
+ `[ ;#xff00 - #xff0f
+ ,@(make-list 8 nil) backspace tab linefeed clear nil return nil nil
+ ;#xff10 - #xff1f
+ nil nil nil pause nil nil nil nil nil nil nil escape nil nil nil nil
+ ;#xff20 - #xff2f
+ nil kanji muhenkan henkan romaji hiragana katakana hiragana-katakana
+ zenkaku hankaku zenkaku-hankaku touroku massyo kana-lock kana-shift
+ eisu-shift
+ ;#xff30 - #xff3f
+ eisu-toggle ,@(make-list 15 nil)
+ ;#xff40 - #xff4f
+ ,@(make-list 16 nil)
+ ;#xff50 - #xff5f
+ home left up right down prior next end begin ,@(make-list 7 nil)
+ ;#xff60 - #xff6f
+ select print execute insert nil undo redo menu find cancel help break
+ nil nil nil nil
+ ;#xff70 - #xff7f
+ ;; nil nil nil nil backtab ,@(make-list 10 nil) kp-numlock
+ nil nil nil nil backtab ,@(make-list 9 nil) mode-switch* kp-numlock
+ ;#xff80 - #xff8f
+ kp-space ,@(make-list 8 nil) kp-tab nil nil nil kp-enter nil nil
+ ;#xff90 - #xff9f
+ nil kp-f1 kp-f2 kp-f3 kp-f4 kp-home kp-left kp-up kp-right kp-down
+ kp-prior kp-next kp-end kp-begin kp-insert kp-delete
+ ;#xffa0 - #xffaf
+ ,@(make-list 10 nil)
+ kp-multiply kp-add kp-separator kp-subtract kp-decimal kp-divide
+ ;#xffb0 - #xffbf
+ kp-0 kp-1 kp-2 kp-3 kp-4 kp-5 kp-6 kp-7 kp-8 kp-9 nil nil nil kp-equal
+ f1 f2
+ ;#xffc0 - #xffcf
+ f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13 f14 f15 f16 f17 f18
+ ;#xffd0 - #xffdf
+ f19 f20 f21 f22 f23 f24 f25 f26 f27 f28 f29 f30 f31 f32 f33 f34
+ ;#xffe0 - #xffef
+ ;; f35 ,@(make-list 15 nil)
+ f35 lshift* rshift* lcontrol* rcontrol* caps-lock* shift-lock*
+ lmeta* rmeta* lalt* ralt* lsuper* rsuper* lhyper* rhyper* nil
+ ;#xff00 - #xffff
+ ,@(make-list 15 nil) delete]
+ "Emacs event representations of X function keys (keysym #xff00 to #xffff).")
+
+;; From 'iso_lispy_function_keys' in 'keyboard.c'
+(defconst xcb:keysyms:-iso-function-keys
+ `[
+ ;#xfe00 - #xfe0f
+ ,@(make-list 16 nil)
+ ;#xfe10 - #xfe1f
+ ,@(make-list 16 nil)
+ ;#xfe20 - #xfe2f
+ iso-lefttab iso-move-line-up iso-move-line-down iso-partial-line-up
+ iso-partial-line-down iso-partial-space-left iso-partial-space-right
+ iso-set-margin-left iso-set-margin-right iso-release-margin-left
+ iso-release-margin-right iso-release-both-margins iso-fast-cursor-left
+ iso-fast-cursor-right iso-fast-cursor-up iso-fast-cursor-down
+ ;#xfe30 - #xfe3f
+ iso-continuous-underline iso-discontinuous-underline iso-emphasize
+ iso-center-object iso-enter ,@(make-list 11 nil)
+ ;everything else
+ ,@(make-list 192 nil)]
+ "Emacs event representations of ISO function keys (#xfe00 to #xfeff).")
+
+;; This list is adapted from 'XF86keysym.h' in X source.
+;; FIXME: We've intentionally left out keysyms outside the range 0x1008FF00 ~
+;; 0x1008FFFF.
+;; REVIEW: Could anybody verify this list?
+(defconst xcb:keysyms:-xf86-keys
+ `[ ;#x1008ff00 - #x1008ff0f
+ nil XF86ModeLock XF86MonBrightnessUp XF86MonBrightnessDown
+ XF86KbdLightOnOff XF86KbdBrightnessUp XF86KbdBrightnessDown
+ ,@(make-list 9 nil)
+ ;#x1008ff10 - #x1008ff1f
+ XF86Standby XF86AudioLowerVolume XF86AudioMute XF86AudioRaiseVolume
+ XF86AudioPlay XF86AudioStop XF86AudioPrev XF86AudioNext XF86HomePage
+ XF86Mail XF86Start XF86Search XF86AudioRecord XF86Calculator XF86Memo
+ XF86ToDoList
+ ;#x1008ff20 - #x1008ff2f
+ XF86Calendar XF86PowerDown XF86ContrastAdjust XF86RockerUp
+ XF86RockerDown XF86RockerEnter XF86Back XF86Forward XF86Stop
+ XF86Refresh XF86PowerOff XF86WakeUp XF86Eject XF86ScreenSaver XF86WWW
+ XF86Sleep
+ ;#x1008ff30 - #x1008ff3f
+ XF86Favorites XF86AudioPause XF86AudioMedia XF86MyComputer
+ XF86VendorHome XF86LightBulb XF86Shop XF86History XF86OpenURL
+ XF86AddFavorite XF86HotLinks XF86BrightnessAdjust XF86Finance
+ XF86Community XF86AudioRewind XF86BackForward
+ ;#x1008ff40 - #x1008ff4f
+ XF86Launch0 XF86Launch1 XF86Launch2 XF86Launch3 XF86Launch4 XF86Launch5
+ XF86Launch6 XF86Launch7 XF86Launch8 XF86Launch9 XF86LaunchA XF86LaunchB
+ XF86LaunchC XF86LaunchD XF86LaunchE XF86LaunchF
+ ;#x1008ff50 - #x1008ff5f
+ XF86ApplicationLeft XF86ApplicationRight XF86Book XF86CD XF86Calculater
+ XF86Clear XF86Close XF86Copy XF86Cut XF86Display XF86DOS XF86Documents
+ XF86Excel XF86Explorer XF86Game XF86Go
+ ;#x1008ff60 - #x1008ff6f
+ XF86iTouch XF86LogOff XF86Market XF86Meeting nil XF86MenuKB XF86MenuPB
+ XF86MySites XF86New XF86News XF86OfficeHome XF86Open XF86Option
+ XF86Paste XF86Phone nil
+ ;#x1008ff70 - #x1008ff7f
+ XF86Q nil XF86Reply XF86Reload XF86RotateWindows XF86RotationPB
+ XF86RotationKB XF86Save XF86ScrollUp XF86ScrollDown XF86ScrollClick
+ XF86Send XF86Spell XF86SplitScreen XF86Support XF86TaskPane
+ ;#x1008ff80 - #x1008ff8f
+ XF86Terminal XF86Tools XF86Travel nil XF86UserPB XF86User1KB
+ XF86User2KB XF86Video XF86WheelButton XF86Word XF86Xfer XF86ZoomIn
+ XF86ZoomOut XF86Away XF86Messenger XF86WebCam
+ ;#x1008ff90 - #x1008ff9f
+ XF86MailForward XF86Pictures XF86Music XF86Battery XF86Bluetooth
+ XF86WLAN XF86UWB XF86AudioForward XF86AudioRepeat XF86AudioRandomPlay
+ XF86Subtitle XF86AudioCycleTrack XF86CycleAngle XF86FrameBack
+ XF86FrameForward XF86Time
+ ;#x1008ffa0 - #x1008ffaf
+ XF86Select XF86View XF86TopMenu XF86Red XF86Green XF86Yellow XF86Blue
+ XF86Suspend XF86Hibernate XF86TouchpadToggle ,@(make-list 6 nil)
+ ;#x1008ffb0 - #x1008ffbf
+ XF86TouchpadOn XF86TouchpadOff XF86AudioMicMute ,@(make-list 13 nil)
+ ;everything rest
+ ,@(make-list 64 nil)]
+ "Emacs event representations of XF86keysym (#x1008ff00 - #x1008ffff).")
+
+(cl-defmethod xcb:keysyms:event->keysyms ((obj xcb:connection) event)
+ "Translate Emacs key event EVENT to list of (keysym . mod-mask).
+
+Return ((0 . 0)) when conversion fails."
+ (let ((modifiers (event-modifiers event))
+ (event (event-basic-type event))
+ keysym)
+ (if (not (integerp event))
+ (setq keysym
+ (pcase event
+ (`mouse-1 xcb:ButtonIndex:1)
+ (`mouse-2 xcb:ButtonIndex:2)
+ (`mouse-3 xcb:ButtonIndex:3)
+ (`mouse-4 xcb:ButtonIndex:4)
+ (`mouse-5 xcb:ButtonIndex:5)
+ (_
+ (cond
+ ((setq keysym (cl-position event
+ xcb:keysyms:-function-keys))
+ ;; Function keys.
+ (logior keysym #xff00))
+ ((setq keysym (cl-position event xcb:keysyms:-xf86-keys))
+ ;; XF86 keys.
+ (logior keysym #x1008ff00))
+ ((setq keysym (cl-position event
+ xcb:keysyms:-iso-function-keys))
+ ;; ISO function keys.
+ (logior keysym #xfe00))
+ ((and (symbolp event)
+ (= 1 (length (symbol-name event))))
+ ;; Symbol representations of ASCII characters.
+ (aref (symbol-name event) 0))
+ (t
+ ;; Finally try system-specific keysyms.
+ (car (rassq event system-key-alist)))))))
+ (setq keysym
+ (cond
+ ((<= #x20 event #xff)
+ ;; Latin-1.
+ event)
+ ((<= #x100 event #x10ffff)
+ ;; Unicode.
+ (+ #x1000000 event))
+ (t (or
+ ;; Try system-specific keysyms.
+ (car (rassq event system-key-alist))
+ ;; Try legacy keysyms.
+ (catch 'break
+ (maphash (lambda (key val)
+ (when (= event val)
+ (throw 'break key)))
+ x-keysym-table)))))))
+ (if (not keysym)
+ '((0 . 0))
+ (when modifiers
+ ;; Do transforms: * -> x-*-keysym -> xcb:keysyms:*-mask.
+ (setq modifiers (mapcar (lambda (i)
+ (or (pcase i
+ (`alt x-alt-keysym)
+ (`meta x-meta-keysym)
+ (`hyper x-hyper-keysym)
+ (`super x-super-keysym))
+ i))
+ modifiers)
+ modifiers (mapcar (lambda (i)
+ (pcase i
+ ((and x (pred integerp)) x)
+ (`meta
+ (when (= 0 xcb:keysyms:meta-mask)
+ (setq keysym 0))
+ xcb:keysyms:meta-mask)
+ (`control
+ (when (= 0 xcb:keysyms:control-mask)
+ (setq keysym 0))
+ xcb:keysyms:control-mask)
+ (`shift
+ (when (= 0 xcb:keysyms:shift-mask)
+ (setq keysym 0))
+ xcb:keysyms:shift-mask)
+ (`hyper
+ (when (= 0 xcb:keysyms:hyper-mask)
+ (setq keysym 0))
+ xcb:keysyms:hyper-mask)
+ (`super
+ (when (= 0 xcb:keysyms:super-mask)
+ (setq keysym 0))
+ xcb:keysyms:super-mask)
+ (`alt
+ (when (= 0 xcb:keysyms:alt-mask)
+ (setq keysym 0))
+ xcb:keysyms:alt-mask)
+ (_
+ ;; Include but not limit to: down.
+ 0)))
+ modifiers)
+ modifiers (apply #'logior modifiers)))
+ (let ((keycode (xcb:keysyms:keysym->keycode obj keysym))
+ extra-modifiers)
+ (when (/= 0 keycode)
+ (setq extra-modifiers (xcb:keysyms:keycode->keysym obj keycode nil)
+ ;; Always try without other modifier.
+ extra-modifiers (append '(0) extra-modifiers)
+ ;; Keep all modifiers helping convert keycode to this keysym.
+ extra-modifiers
+ (delq nil
+ (mapcar (lambda (modifier)
+ (when (= (car (xcb:keysyms:keycode->keysym
+ obj keycode modifier))
+ keysym)
+ modifier))
+ extra-modifiers))))
+ (mapcar (lambda (extra-modifier)
+ (cons keysym (logior (or modifiers 0) extra-modifier)))
+ extra-modifiers)))))
+
+(cl-defmethod xcb:keysyms:keysym->event ((_obj xcb:connection) keysym
+ &optional mask allow-modifiers)
+ "Translate X Keysym KEYSYM into Emacs key event.
+
+One may use MASK to provide modifier keys. If ALLOW-MODIFIERS is non-nil,
+this function will also return symbols for pure modifiers keys."
+ ;; Convert nil to 0.
+ (unless mask
+ (setq mask 0))
+ (let ((event (cond ((<= #x20 keysym #xff)
+ keysym)
+ ((<= #xff00 keysym #xffff)
+ (aref xcb:keysyms:-function-keys (logand keysym #xff)))
+ ((<= #x1000100 keysym #x110ffff)
+ (- keysym #x1000000))
+ ((<= 1 keysym 5) ;ButtonPress assuemd
+ (intern-soft (format "down-mouse-%d" keysym)))
+ ((<= #x1008ff00 keysym #x1008ffff)
+ (aref xcb:keysyms:-xf86-keys (logand keysym #xff)))
+ ((<= #xfe00 keysym #xfeff)
+ (aref xcb:keysyms:-iso-function-keys
+ (logand keysym #xff)))
+ (t (or
+ ;; Search system-specific keysyms.
+ (car (assq keysym system-key-alist))
+ ;; Search `x-keysym-table' for legacy keysyms.
+ (gethash keysym x-keysym-table)))))
+ mod-alt mod-meta mod-hyper mod-super)
+ (when event
+ (if allow-modifiers
+ (when (/= 0 mask)
+ ;; Clear modifier bits for modifier keys.
+ (pcase event
+ ((or `lmeta* `rmeta*)
+ (setq mask (logand mask (lognot xcb:keysyms:meta-mask))))
+ ((or `lcontrol* `rcontrol*)
+ (setq mask (logand mask (lognot xcb:keysyms:control-mask))))
+ ((or `lshift* `rshift*)
+ (setq mask (logand mask (lognot xcb:keysyms:shift-mask))))
+ ((or `lhyper* `rhyper*)
+ (setq mask (logand mask (lognot xcb:keysyms:hyper-mask))))
+ ((or `lsuper* `rsuper*)
+ (setq mask (logand mask (lognot xcb:keysyms:super-mask))))
+ ((or `lalt* `ralt*)
+ (setq mask (logand mask (lognot xcb:keysyms:alt-mask))))))
+ (when (memq event
+ '(lshift*
+ rshift*
+ lcontrol*
+ rcontrol*
+ caps-lock*
+ shift-lock*
+ lmeta*
+ rmeta*
+ lalt*
+ ralt*
+ lsuper*
+ rsuper*
+ lhyper*
+ rhyper*
+ mode-switch*
+ kp-numlock))
+ (setq event nil))))
+ (when event
+ (if (= 0 mask)
+ event
+ ;; Set mod-* if possible.
+ (when x-alt-keysym
+ (pcase x-alt-keysym
+ (`meta (setq mod-meta 'alt))
+ (`hyper (setq mod-hyper 'alt))
+ (`super (setq mod-super 'alt))))
+ (when x-meta-keysym
+ (pcase x-meta-keysym
+ (`alt (setq mod-alt 'meta))
+ (`hyper (setq mod-hyper 'meta))
+ (`super (setq mod-super 'meta))))
+ (when x-hyper-keysym
+ (pcase x-hyper-keysym
+ (`alt (setq mod-alt 'hyper))
+ (`meta (setq mod-meta 'hyper))
+ (`super (setq mod-super 'hyper))))
+ (when x-super-keysym
+ (pcase x-super-keysym
+ (`alt (setq mod-alt 'super))
+ (`meta (setq mod-meta 'super))
+ (`hyper (setq mod-hyper 'super))))
+ ;; Convert modifiers.
+ (setq event (list event))
+ (when (/= 0 (logand mask xcb:keysyms:meta-mask))
+ (push (or mod-meta 'meta) event))
+ (when (/= 0 (logand mask xcb:keysyms:control-mask))
+ (push 'control event))
+ (when (and (/= 0 (logand mask (logior xcb:keysyms:shift-mask
+ xcb:keysyms:shift-lock-mask)))
+ (or (not (<= #x20 keysym #xff)) ;Not a Latin-1 character
+ (<= ?A keysym ?Z))) ;An uppercase letter
+ (push 'shift event))
+ (when (/= 0 (logand mask xcb:keysyms:hyper-mask))
+ (push (or mod-hyper 'hyper) event))
+ (when (/= 0 (logand mask xcb:keysyms:super-mask))
+ (push (or mod-super 'super) event))
+ (when (/= 0 (logand mask xcb:keysyms:alt-mask))
+ (push (or mod-alt 'alt) event))
+ (event-convert-list event)))))
+
+
+
+(provide 'xcb-keysyms)
+
+;;; xcb-keysyms.el ends here
diff --git a/elpa/xelb-0.20/xcb-keysyms.elc b/elpa/xelb-0.20/xcb-keysyms.elc
new file mode 100644
index 0000000..2ef95ac
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-keysyms.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-present.el b/elpa/xelb-0.20/xcb-present.el
new file mode 100644
index 0000000..ba44c84
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-present.el
@@ -0,0 +1,269 @@
+;;; xcb-present.el --- X11 Present extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'present.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:present:-extension-xname "Present")
+(defconst xcb:present:-extension-name "Present")
+(defconst xcb:present:-major-version 1)
+(defconst xcb:present:-minor-version 4)
+
+(require 'xcb-xproto)
+
+(require 'xcb-randr)
+
+(require 'xcb-xfixes)
+
+(require 'xcb-sync)
+
+(require 'xcb-dri3)
+
+(defconst xcb:present:Event:ConfigureNotify 0)
+(defconst xcb:present:Event:CompleteNotify 1)
+(defconst xcb:present:Event:IdleNotify 2)
+(defconst xcb:present:Event:RedirectNotify 3)
+
+(defconst xcb:present:EventMask:NoEvent 0)
+(defconst xcb:present:EventMask:ConfigureNotify 1)
+(defconst xcb:present:EventMask:CompleteNotify 2)
+(defconst xcb:present:EventMask:IdleNotify 4)
+(defconst xcb:present:EventMask:RedirectNotify 8)
+
+(defconst xcb:present:Option:None 0)
+(defconst xcb:present:Option:Async 1)
+(defconst xcb:present:Option:Copy 2)
+(defconst xcb:present:Option:UST 4)
+(defconst xcb:present:Option:Suboptimal 8)
+(defconst xcb:present:Option:AsyncMayTear 16)
+
+(defconst xcb:present:Capability:None 0)
+(defconst xcb:present:Capability:Async 1)
+(defconst xcb:present:Capability:Fence 2)
+(defconst xcb:present:Capability:UST 4)
+(defconst xcb:present:Capability:AsyncMayTear 8)
+(defconst xcb:present:Capability:Syncobj 16)
+
+(defconst xcb:present:CompleteKind:Pixmap 0)
+(defconst xcb:present:CompleteKind:NotifyMSC 1)
+
+(defconst xcb:present:CompleteMode:Copy 0)
+(defconst xcb:present:CompleteMode:Flip 1)
+(defconst xcb:present:CompleteMode:Skip 2)
+(defconst xcb:present:CompleteMode:SuboptimalCopy 3)
+
+(defclass xcb:present:Notify
+ (xcb:-struct)
+ ((window :initarg :window :type xcb:WINDOW)
+ (serial :initarg :serial :type xcb:CARD32)))
+
+(defclass xcb:present:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)))
+(defclass xcb:present:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)))
+
+(defclass xcb:present:Pixmap
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (pad~0 :initform 8 :type xcb:-pad-align)
+ (window :initarg :window :type xcb:WINDOW)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)
+ (serial :initarg :serial :type xcb:CARD32)
+ (valid :initarg :valid :type xcb:xfixes:REGION)
+ (update :initarg :update :type xcb:xfixes:REGION)
+ (x-off :initarg :x-off :type xcb:INT16)
+ (y-off :initarg :y-off :type xcb:INT16)
+ (target-crtc :initarg :target-crtc :type xcb:randr:CRTC)
+ (wait-fence :initarg :wait-fence :type xcb:sync:FENCE)
+ (idle-fence :initarg :idle-fence :type xcb:sync:FENCE)
+ (options :initarg :options :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (target-msc :initarg :target-msc :type xcb:CARD64)
+ (divisor :initarg :divisor :type xcb:CARD64)
+ (remainder :initarg :remainder :type xcb:CARD64)
+ (notifies~ :initform
+ '(name notifies type xcb:present:Notify size nil)
+ :type xcb:-list)
+ (notifies :initarg :notifies :type xcb:-ignore)))
+
+(defclass xcb:present:NotifyMSC
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (pad~0 :initform 8 :type xcb:-pad-align)
+ (window :initarg :window :type xcb:WINDOW)
+ (serial :initarg :serial :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (target-msc :initarg :target-msc :type xcb:CARD64)
+ (divisor :initarg :divisor :type xcb:CARD64)
+ (remainder :initarg :remainder :type xcb:CARD64)))
+
+(xcb:deftypealias 'xcb:present:EVENT 'xcb:-u4)
+
+(defclass xcb:present:SelectInput
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (eid :initarg :eid :type xcb:present:EVENT)
+ (window :initarg :window :type xcb:WINDOW)
+ (event-mask :initarg :event-mask :type xcb:CARD32)))
+
+(defclass xcb:present:QueryCapabilities
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (target :initarg :target :type xcb:CARD32)))
+(defclass xcb:present:QueryCapabilities~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (capabilities :initarg :capabilities :type xcb:CARD32)))
+
+(defclass xcb:present:PixmapSynced
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (pad~0 :initform 8 :type xcb:-pad-align)
+ (window :initarg :window :type xcb:WINDOW)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)
+ (serial :initarg :serial :type xcb:CARD32)
+ (valid :initarg :valid :type xcb:xfixes:REGION)
+ (update :initarg :update :type xcb:xfixes:REGION)
+ (x-off :initarg :x-off :type xcb:INT16)
+ (y-off :initarg :y-off :type xcb:INT16)
+ (target-crtc :initarg :target-crtc :type xcb:randr:CRTC)
+ (acquire-syncobj :initarg :acquire-syncobj :type xcb:dri3:SYNCOBJ)
+ (release-syncobj :initarg :release-syncobj :type xcb:dri3:SYNCOBJ)
+ (acquire-point :initarg :acquire-point :type xcb:CARD64)
+ (release-point :initarg :release-point :type xcb:CARD64)
+ (options :initarg :options :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (target-msc :initarg :target-msc :type xcb:CARD64)
+ (divisor :initarg :divisor :type xcb:CARD64)
+ (remainder :initarg :remainder :type xcb:CARD64)
+ (notifies~ :initform
+ '(name notifies type xcb:present:Notify size nil)
+ :type xcb:-list)
+ (notifies :initarg :notifies :type xcb:-ignore)))
+
+(defclass xcb:present:Generic
+ (xcb:-event)
+ ((~code :initform 0)
+ (extension :initarg :extension :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :initarg :length :type xcb:CARD32)
+ (evtype :initarg :evtype :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (event :initarg :event :type xcb:present:EVENT)))
+
+(defclass xcb:present:ConfigureNotify
+ (xcb:-generic-event)
+ ((~evtype :initform 0)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (event :initarg :event :type xcb:present:EVENT)
+ (window :initarg :window :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (off-x :initarg :off-x :type xcb:INT16)
+ (off-y :initarg :off-y :type xcb:INT16)
+ (pixmap-width :initarg :pixmap-width :type xcb:CARD16)
+ (pixmap-height :initarg :pixmap-height :type xcb:CARD16)
+ (pixmap-flags :initarg :pixmap-flags :type xcb:CARD32)))
+
+(defclass xcb:present:CompleteNotify
+ (xcb:-generic-event)
+ ((~evtype :initform 1)
+ (pad~0 :initform 8 :type xcb:-pad-align)
+ (kind :initarg :kind :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (event :initarg :event :type xcb:present:EVENT)
+ (window :initarg :window :type xcb:WINDOW)
+ (serial :initarg :serial :type xcb:CARD32)
+ (ust :initarg :ust :type xcb:CARD64)
+ (msc :initarg :msc :type xcb:CARD64)))
+
+(defclass xcb:present:IdleNotify
+ (xcb:-generic-event)
+ ((~evtype :initform 2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (event :initarg :event :type xcb:present:EVENT)
+ (window :initarg :window :type xcb:WINDOW)
+ (serial :initarg :serial :type xcb:CARD32)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)
+ (idle-fence :initarg :idle-fence :type xcb:sync:FENCE)))
+
+(defclass xcb:present:RedirectNotify
+ (xcb:-generic-event)
+ ((~evtype :initform 3)
+ (pad~0 :initform 8 :type xcb:-pad-align)
+ (update-window :initarg :update-window :type xcb:BOOL)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (event :initarg :event :type xcb:present:EVENT)
+ (event-window :initarg :event-window :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)
+ (serial :initarg :serial :type xcb:CARD32)
+ (valid-region :initarg :valid-region :type xcb:xfixes:REGION)
+ (update-region :initarg :update-region :type xcb:xfixes:REGION)
+ (valid-rect :initarg :valid-rect :type xcb:RECTANGLE)
+ (update-rect :initarg :update-rect :type xcb:RECTANGLE)
+ (x-off :initarg :x-off :type xcb:INT16)
+ (y-off :initarg :y-off :type xcb:INT16)
+ (target-crtc :initarg :target-crtc :type xcb:randr:CRTC)
+ (wait-fence :initarg :wait-fence :type xcb:sync:FENCE)
+ (idle-fence :initarg :idle-fence :type xcb:sync:FENCE)
+ (options :initarg :options :type xcb:CARD32)
+ (pad~2 :initform 4 :type xcb:-pad)
+ (target-msc :initarg :target-msc :type xcb:CARD64)
+ (divisor :initarg :divisor :type xcb:CARD64)
+ (remainder :initarg :remainder :type xcb:CARD64)
+ (notifies~ :initform
+ '(name notifies type xcb:present:Notify size nil)
+ :type xcb:-list)
+ (notifies :initarg :notifies :type xcb:-ignore)))
+
+(defconst xcb:present:event-number-class-alist
+ '((0 . xcb:present:Generic))
+ "(event-number . event-class) alist.")
+
+(defconst xcb:present:xge-number-class-alist
+ '((0 . xcb:present:ConfigureNotify)
+ (1 . xcb:present:CompleteNotify)
+ (2 . xcb:present:IdleNotify)
+ (3 . xcb:present:RedirectNotify))
+ "(xge-number . event-class) alist.")
+
+
+
+(provide 'xcb-present)
+
+;;; xcb-present.el ends here
diff --git a/elpa/xelb-0.20/xcb-present.elc b/elpa/xelb-0.20/xcb-present.elc
new file mode 100644
index 0000000..034766a
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-present.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-randr.el b/elpa/xelb-0.20/xcb-randr.el
new file mode 100644
index 0000000..cb0dc9b
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-randr.el
@@ -0,0 +1,1121 @@
+;;; xcb-randr.el --- X11 RandR extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'randr.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:randr:-extension-xname "RANDR")
+(defconst xcb:randr:-extension-name "RandR")
+(defconst xcb:randr:-major-version 1)
+(defconst xcb:randr:-minor-version 6)
+
+(require 'xcb-xproto)
+
+(require 'xcb-render)
+
+(xcb:deftypealias 'xcb:randr:MODE 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:randr:CRTC 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:randr:OUTPUT 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:randr:PROVIDER 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:randr:LEASE 'xcb:-u4)
+
+(defclass xcb:randr:BadOutput
+ (xcb:-error)
+ ((~code :initform 0)))
+
+(defclass xcb:randr:BadCrtc
+ (xcb:-error)
+ ((~code :initform 1)))
+
+(defclass xcb:randr:BadMode
+ (xcb:-error)
+ ((~code :initform 2)))
+
+(defclass xcb:randr:BadProvider
+ (xcb:-error)
+ ((~code :initform 3)))
+
+(defconst xcb:randr:Rotation:Rotate_0 1)
+(defconst xcb:randr:Rotation:Rotate_90 2)
+(defconst xcb:randr:Rotation:Rotate_180 4)
+(defconst xcb:randr:Rotation:Rotate_270 8)
+(defconst xcb:randr:Rotation:Reflect_X 16)
+(defconst xcb:randr:Rotation:Reflect_Y 32)
+
+(defclass xcb:randr:ScreenSize
+ (xcb:-struct)
+ ((width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (mwidth :initarg :mwidth :type xcb:CARD16)
+ (mheight :initarg :mheight :type xcb:CARD16)))
+
+(defclass xcb:randr:RefreshRates
+ (xcb:-struct)
+ ((nRates :initarg :nRates :type xcb:CARD16)
+ (rates~ :initform
+ '(name rates type xcb:CARD16 size
+ (xcb:-fieldref 'nRates))
+ :type xcb:-list)
+ (rates :initarg :rates :type xcb:-ignore)))
+
+(defclass xcb:randr:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)))
+(defclass xcb:randr:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)))
+
+(defconst xcb:randr:SetConfig:Success 0)
+(defconst xcb:randr:SetConfig:InvalidConfigTime 1)
+(defconst xcb:randr:SetConfig:InvalidTime 2)
+(defconst xcb:randr:SetConfig:Failed 3)
+
+(defclass xcb:randr:SetScreenConfig
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)
+ (sizeID :initarg :sizeID :type xcb:CARD16)
+ (rotation :initarg :rotation :type xcb:CARD16)
+ (rate :initarg :rate :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:randr:SetScreenConfig~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (new-timestamp :initarg :new-timestamp :type xcb:TIMESTAMP)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)
+ (root :initarg :root :type xcb:WINDOW)
+ (subpixel-order :initarg :subpixel-order :type xcb:CARD16)
+ (pad~0 :initform 10 :type xcb:-pad)))
+
+(defconst xcb:randr:NotifyMask:ScreenChange 1)
+(defconst xcb:randr:NotifyMask:CrtcChange 2)
+(defconst xcb:randr:NotifyMask:OutputChange 4)
+(defconst xcb:randr:NotifyMask:OutputProperty 8)
+(defconst xcb:randr:NotifyMask:ProviderChange 16)
+(defconst xcb:randr:NotifyMask:ProviderProperty 32)
+(defconst xcb:randr:NotifyMask:ResourceChange 64)
+(defconst xcb:randr:NotifyMask:Lease 128)
+
+(defclass xcb:randr:SelectInput
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (enable :initarg :enable :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:randr:GetScreenInfo
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:randr:GetScreenInfo~reply
+ (xcb:-reply)
+ ((rotations :initarg :rotations :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)
+ (nSizes :initarg :nSizes :type xcb:CARD16)
+ (sizeID :initarg :sizeID :type xcb:CARD16)
+ (rotation :initarg :rotation :type xcb:CARD16)
+ (rate :initarg :rate :type xcb:CARD16)
+ (nInfo :initarg :nInfo :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (sizes~ :initform
+ '(name sizes type xcb:randr:ScreenSize size
+ (xcb:-fieldref 'nSizes))
+ :type xcb:-list)
+ (sizes :initarg :sizes :type xcb:-ignore)
+ (rates~ :initform
+ '(name rates type xcb:randr:RefreshRates size
+ (-
+ (xcb:-fieldref 'nInfo)
+ (xcb:-fieldref 'nSizes)))
+ :type xcb:-list)
+ (rates :initarg :rates :type xcb:-ignore)))
+
+(defclass xcb:randr:GetScreenSizeRange
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:randr:GetScreenSizeRange~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (min-width :initarg :min-width :type xcb:CARD16)
+ (min-height :initarg :min-height :type xcb:CARD16)
+ (max-width :initarg :max-width :type xcb:CARD16)
+ (max-height :initarg :max-height :type xcb:CARD16)
+ (pad~1 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:randr:SetScreenSize
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (mm-width :initarg :mm-width :type xcb:CARD32)
+ (mm-height :initarg :mm-height :type xcb:CARD32)))
+
+(defconst xcb:randr:ModeFlag:HsyncPositive 1)
+(defconst xcb:randr:ModeFlag:HsyncNegative 2)
+(defconst xcb:randr:ModeFlag:VsyncPositive 4)
+(defconst xcb:randr:ModeFlag:VsyncNegative 8)
+(defconst xcb:randr:ModeFlag:Interlace 16)
+(defconst xcb:randr:ModeFlag:DoubleScan 32)
+(defconst xcb:randr:ModeFlag:Csync 64)
+(defconst xcb:randr:ModeFlag:CsyncPositive 128)
+(defconst xcb:randr:ModeFlag:CsyncNegative 256)
+(defconst xcb:randr:ModeFlag:HskewPresent 512)
+(defconst xcb:randr:ModeFlag:Bcast 1024)
+(defconst xcb:randr:ModeFlag:PixelMultiplex 2048)
+(defconst xcb:randr:ModeFlag:DoubleClock 4096)
+(defconst xcb:randr:ModeFlag:HalveClock 8192)
+
+(defclass xcb:randr:ModeInfo
+ (xcb:-struct)
+ ((id :initarg :id :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (dot-clock :initarg :dot-clock :type xcb:CARD32)
+ (hsync-start :initarg :hsync-start :type xcb:CARD16)
+ (hsync-end :initarg :hsync-end :type xcb:CARD16)
+ (htotal :initarg :htotal :type xcb:CARD16)
+ (hskew :initarg :hskew :type xcb:CARD16)
+ (vsync-start :initarg :vsync-start :type xcb:CARD16)
+ (vsync-end :initarg :vsync-end :type xcb:CARD16)
+ (vtotal :initarg :vtotal :type xcb:CARD16)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (mode-flags :initarg :mode-flags :type xcb:CARD32)))
+
+(defclass xcb:randr:GetScreenResources
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:randr:GetScreenResources~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)
+ (num-crtcs :initarg :num-crtcs :type xcb:CARD16)
+ (num-outputs :initarg :num-outputs :type xcb:CARD16)
+ (num-modes :initarg :num-modes :type xcb:CARD16)
+ (names-len :initarg :names-len :type xcb:CARD16)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (crtcs~ :initform
+ '(name crtcs type xcb:randr:CRTC size
+ (xcb:-fieldref 'num-crtcs))
+ :type xcb:-list)
+ (crtcs :initarg :crtcs :type xcb:-ignore)
+ (outputs~ :initform
+ '(name outputs type xcb:randr:OUTPUT size
+ (xcb:-fieldref 'num-outputs))
+ :type xcb:-list)
+ (outputs :initarg :outputs :type xcb:-ignore)
+ (modes~ :initform
+ '(name modes type xcb:randr:ModeInfo size
+ (xcb:-fieldref 'num-modes))
+ :type xcb:-list)
+ (modes :initarg :modes :type xcb:-ignore)
+ (names~ :initform
+ '(name names type xcb:BYTE size
+ (xcb:-fieldref 'names-len))
+ :type xcb:-list)
+ (names :initarg :names :type xcb:-ignore)))
+
+(defconst xcb:randr:Connection:Connected 0)
+(defconst xcb:randr:Connection:Disconnected 1)
+(defconst xcb:randr:Connection:Unknown 2)
+
+(defclass xcb:randr:GetOutputInfo
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)))
+(defclass xcb:randr:GetOutputInfo~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)
+ (mm-width :initarg :mm-width :type xcb:CARD32)
+ (mm-height :initarg :mm-height :type xcb:CARD32)
+ (connection :initarg :connection :type xcb:CARD8)
+ (subpixel-order :initarg :subpixel-order :type xcb:CARD8)
+ (num-crtcs :initarg :num-crtcs :type xcb:CARD16)
+ (num-modes :initarg :num-modes :type xcb:CARD16)
+ (num-preferred :initarg :num-preferred :type xcb:CARD16)
+ (num-clones :initarg :num-clones :type xcb:CARD16)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (crtcs~ :initform
+ '(name crtcs type xcb:randr:CRTC size
+ (xcb:-fieldref 'num-crtcs))
+ :type xcb:-list)
+ (crtcs :initarg :crtcs :type xcb:-ignore)
+ (modes~ :initform
+ '(name modes type xcb:randr:MODE size
+ (xcb:-fieldref 'num-modes))
+ :type xcb:-list)
+ (modes :initarg :modes :type xcb:-ignore)
+ (clones~ :initform
+ '(name clones type xcb:randr:OUTPUT size
+ (xcb:-fieldref 'num-clones))
+ :type xcb:-list)
+ (clones :initarg :clones :type xcb:-ignore)
+ (name~ :initform
+ '(name name type xcb:BYTE size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:randr:ListOutputProperties
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)))
+(defclass xcb:randr:ListOutputProperties~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-atoms :initarg :num-atoms :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (atoms~ :initform
+ '(name atoms type xcb:ATOM size
+ (xcb:-fieldref 'num-atoms))
+ :type xcb:-list)
+ (atoms :initarg :atoms :type xcb:-ignore)))
+
+(defclass xcb:randr:QueryOutputProperty
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (property :initarg :property :type xcb:ATOM)))
+(defclass xcb:randr:QueryOutputProperty~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pending :initarg :pending :type xcb:BOOL)
+ (range :initarg :range :type xcb:BOOL)
+ (immutable :initarg :immutable :type xcb:BOOL)
+ (pad~1 :initform 21 :type xcb:-pad)
+ (validValues~ :initform
+ '(name validValues type xcb:INT32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (validValues :initarg :validValues :type xcb:-ignore)))
+
+(defclass xcb:randr:ConfigureOutputProperty
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (property :initarg :property :type xcb:ATOM)
+ (pending :initarg :pending :type xcb:BOOL)
+ (range :initarg :range :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (values~ :initform
+ '(name values type xcb:INT32 size nil)
+ :type xcb:-list)
+ (values :initarg :values :type xcb:-ignore)))
+
+(defclass xcb:randr:ChangeOutputProperty
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (format :initarg :format :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (num-units :initarg :num-units :type xcb:CARD32)
+ (data~ :initform
+ '(name data type xcb:void size
+ (/
+ (*
+ (xcb:-fieldref 'num-units)
+ (xcb:-fieldref 'format))
+ 8))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:randr:DeleteOutputProperty
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (property :initarg :property :type xcb:ATOM)))
+
+(defclass xcb:randr:GetOutputProperty
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (long-offset :initarg :long-offset :type xcb:CARD32)
+ (long-length :initarg :long-length :type xcb:CARD32)
+ (delete :initarg :delete :type xcb:BOOL)
+ (pending :initarg :pending :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:randr:GetOutputProperty~reply
+ (xcb:-reply)
+ ((format :initarg :format :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (type :initarg :type :type xcb:ATOM)
+ (bytes-after :initarg :bytes-after :type xcb:CARD32)
+ (num-items :initarg :num-items :type xcb:CARD32)
+ (pad~0 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'num-items)
+ (/
+ (xcb:-fieldref 'format)
+ 8)))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:randr:CreateMode
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (mode-info :initarg :mode-info :type xcb:randr:ModeInfo)
+ (name~ :initform
+ '(name name type xcb:char size nil)
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+(defclass xcb:randr:CreateMode~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (mode :initarg :mode :type xcb:randr:MODE)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:randr:DestroyMode
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:randr:MODE)))
+
+(defclass xcb:randr:AddOutputMode
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (mode :initarg :mode :type xcb:randr:MODE)))
+
+(defclass xcb:randr:DeleteOutputMode
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (mode :initarg :mode :type xcb:randr:MODE)))
+
+(defclass xcb:randr:GetCrtcInfo
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)))
+(defclass xcb:randr:GetCrtcInfo~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (mode :initarg :mode :type xcb:randr:MODE)
+ (rotation :initarg :rotation :type xcb:CARD16)
+ (rotations :initarg :rotations :type xcb:CARD16)
+ (num-outputs :initarg :num-outputs :type xcb:CARD16)
+ (num-possible-outputs :initarg :num-possible-outputs :type xcb:CARD16)
+ (outputs~ :initform
+ '(name outputs type xcb:randr:OUTPUT size
+ (xcb:-fieldref 'num-outputs))
+ :type xcb:-list)
+ (outputs :initarg :outputs :type xcb:-ignore)
+ (possible~ :initform
+ '(name possible type xcb:randr:OUTPUT size
+ (xcb:-fieldref 'num-possible-outputs))
+ :type xcb:-list)
+ (possible :initarg :possible :type xcb:-ignore)))
+
+(defclass xcb:randr:SetCrtcConfig
+ (xcb:-request)
+ ((~opcode :initform 21 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (mode :initarg :mode :type xcb:randr:MODE)
+ (rotation :initarg :rotation :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (outputs~ :initform
+ '(name outputs type xcb:randr:OUTPUT size nil)
+ :type xcb:-list)
+ (outputs :initarg :outputs :type xcb:-ignore)))
+(defclass xcb:randr:SetCrtcConfig~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (pad~0 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:randr:GetCrtcGammaSize
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)))
+(defclass xcb:randr:GetCrtcGammaSize~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (size :initarg :size :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)))
+
+(defclass xcb:randr:GetCrtcGamma
+ (xcb:-request)
+ ((~opcode :initform 23 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)))
+(defclass xcb:randr:GetCrtcGamma~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (size :initarg :size :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (red~ :initform
+ '(name red type xcb:CARD16 size
+ (xcb:-fieldref 'size))
+ :type xcb:-list)
+ (red :initarg :red :type xcb:-ignore)
+ (green~ :initform
+ '(name green type xcb:CARD16 size
+ (xcb:-fieldref 'size))
+ :type xcb:-list)
+ (green :initarg :green :type xcb:-ignore)
+ (blue~ :initform
+ '(name blue type xcb:CARD16 size
+ (xcb:-fieldref 'size))
+ :type xcb:-list)
+ (blue :initarg :blue :type xcb:-ignore)))
+
+(defclass xcb:randr:SetCrtcGamma
+ (xcb:-request)
+ ((~opcode :initform 24 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)
+ (size :initarg :size :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (red~ :initform
+ '(name red type xcb:CARD16 size
+ (xcb:-fieldref 'size))
+ :type xcb:-list)
+ (red :initarg :red :type xcb:-ignore)
+ (green~ :initform
+ '(name green type xcb:CARD16 size
+ (xcb:-fieldref 'size))
+ :type xcb:-list)
+ (green :initarg :green :type xcb:-ignore)
+ (blue~ :initform
+ '(name blue type xcb:CARD16 size
+ (xcb:-fieldref 'size))
+ :type xcb:-list)
+ (blue :initarg :blue :type xcb:-ignore)))
+
+(defclass xcb:randr:GetScreenResourcesCurrent
+ (xcb:-request)
+ ((~opcode :initform 25 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:randr:GetScreenResourcesCurrent~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)
+ (num-crtcs :initarg :num-crtcs :type xcb:CARD16)
+ (num-outputs :initarg :num-outputs :type xcb:CARD16)
+ (num-modes :initarg :num-modes :type xcb:CARD16)
+ (names-len :initarg :names-len :type xcb:CARD16)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (crtcs~ :initform
+ '(name crtcs type xcb:randr:CRTC size
+ (xcb:-fieldref 'num-crtcs))
+ :type xcb:-list)
+ (crtcs :initarg :crtcs :type xcb:-ignore)
+ (outputs~ :initform
+ '(name outputs type xcb:randr:OUTPUT size
+ (xcb:-fieldref 'num-outputs))
+ :type xcb:-list)
+ (outputs :initarg :outputs :type xcb:-ignore)
+ (modes~ :initform
+ '(name modes type xcb:randr:ModeInfo size
+ (xcb:-fieldref 'num-modes))
+ :type xcb:-list)
+ (modes :initarg :modes :type xcb:-ignore)
+ (names~ :initform
+ '(name names type xcb:BYTE size
+ (xcb:-fieldref 'names-len))
+ :type xcb:-list)
+ (names :initarg :names :type xcb:-ignore)))
+
+(defconst xcb:randr:Transform:Unit 1)
+(defconst xcb:randr:Transform:ScaleUp 2)
+(defconst xcb:randr:Transform:ScaleDown 4)
+(defconst xcb:randr:Transform:Projective 8)
+
+(defclass xcb:randr:SetCrtcTransform
+ (xcb:-request)
+ ((~opcode :initform 26 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)
+ (transform :initarg :transform :type xcb:render:TRANSFORM)
+ (filter-len :initarg :filter-len :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (filter-name~ :initform
+ '(name filter-name type xcb:char size
+ (xcb:-fieldref 'filter-len))
+ :type xcb:-list)
+ (filter-name :initarg :filter-name :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (filter-params~ :initform
+ '(name filter-params type xcb:render:FIXED size nil)
+ :type xcb:-list)
+ (filter-params :initarg :filter-params :type xcb:-ignore)))
+
+(defclass xcb:randr:GetCrtcTransform
+ (xcb:-request)
+ ((~opcode :initform 27 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)))
+(defclass xcb:randr:GetCrtcTransform~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pending-transform :initarg :pending-transform :type xcb:render:TRANSFORM)
+ (has-transforms :initarg :has-transforms :type xcb:BOOL)
+ (pad~1 :initform 3 :type xcb:-pad)
+ (current-transform :initarg :current-transform :type xcb:render:TRANSFORM)
+ (pad~2 :initform 4 :type xcb:-pad)
+ (pending-len :initarg :pending-len :type xcb:CARD16)
+ (pending-nparams :initarg :pending-nparams :type xcb:CARD16)
+ (current-len :initarg :current-len :type xcb:CARD16)
+ (current-nparams :initarg :current-nparams :type xcb:CARD16)
+ (pending-filter-name~ :initform
+ '(name pending-filter-name type xcb:char size
+ (xcb:-fieldref 'pending-len))
+ :type xcb:-list)
+ (pending-filter-name :initarg :pending-filter-name :type xcb:-ignore)
+ (pad~3 :initform 4 :type xcb:-pad-align)
+ (pending-params~ :initform
+ '(name pending-params type xcb:render:FIXED size
+ (xcb:-fieldref 'pending-nparams))
+ :type xcb:-list)
+ (pending-params :initarg :pending-params :type xcb:-ignore)
+ (current-filter-name~ :initform
+ '(name current-filter-name type xcb:char size
+ (xcb:-fieldref 'current-len))
+ :type xcb:-list)
+ (current-filter-name :initarg :current-filter-name :type xcb:-ignore)
+ (pad~4 :initform 4 :type xcb:-pad-align)
+ (current-params~ :initform
+ '(name current-params type xcb:render:FIXED size
+ (xcb:-fieldref 'current-nparams))
+ :type xcb:-list)
+ (current-params :initarg :current-params :type xcb:-ignore)))
+
+(defclass xcb:randr:GetPanning
+ (xcb:-request)
+ ((~opcode :initform 28 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)))
+(defclass xcb:randr:GetPanning~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (left :initarg :left :type xcb:CARD16)
+ (top :initarg :top :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (track-left :initarg :track-left :type xcb:CARD16)
+ (track-top :initarg :track-top :type xcb:CARD16)
+ (track-width :initarg :track-width :type xcb:CARD16)
+ (track-height :initarg :track-height :type xcb:CARD16)
+ (border-left :initarg :border-left :type xcb:INT16)
+ (border-top :initarg :border-top :type xcb:INT16)
+ (border-right :initarg :border-right :type xcb:INT16)
+ (border-bottom :initarg :border-bottom :type xcb:INT16)))
+
+(defclass xcb:randr:SetPanning
+ (xcb:-request)
+ ((~opcode :initform 29 :type xcb:-u1)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (left :initarg :left :type xcb:CARD16)
+ (top :initarg :top :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (track-left :initarg :track-left :type xcb:CARD16)
+ (track-top :initarg :track-top :type xcb:CARD16)
+ (track-width :initarg :track-width :type xcb:CARD16)
+ (track-height :initarg :track-height :type xcb:CARD16)
+ (border-left :initarg :border-left :type xcb:INT16)
+ (border-top :initarg :border-top :type xcb:INT16)
+ (border-right :initarg :border-right :type xcb:INT16)
+ (border-bottom :initarg :border-bottom :type xcb:INT16)))
+(defclass xcb:randr:SetPanning~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)))
+
+(defclass xcb:randr:SetOutputPrimary
+ (xcb:-request)
+ ((~opcode :initform 30 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (output :initarg :output :type xcb:randr:OUTPUT)))
+
+(defclass xcb:randr:GetOutputPrimary
+ (xcb:-request)
+ ((~opcode :initform 31 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:randr:GetOutputPrimary~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (output :initarg :output :type xcb:randr:OUTPUT)))
+
+(defclass xcb:randr:GetProviders
+ (xcb:-request)
+ ((~opcode :initform 32 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:randr:GetProviders~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (num-providers :initarg :num-providers :type xcb:CARD16)
+ (pad~1 :initform 18 :type xcb:-pad)
+ (providers~ :initform
+ '(name providers type xcb:randr:PROVIDER size
+ (xcb:-fieldref 'num-providers))
+ :type xcb:-list)
+ (providers :initarg :providers :type xcb:-ignore)))
+
+(defconst xcb:randr:ProviderCapability:SourceOutput 1)
+(defconst xcb:randr:ProviderCapability:SinkOutput 2)
+(defconst xcb:randr:ProviderCapability:SourceOffload 4)
+(defconst xcb:randr:ProviderCapability:SinkOffload 8)
+
+(defclass xcb:randr:GetProviderInfo
+ (xcb:-request)
+ ((~opcode :initform 33 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)))
+(defclass xcb:randr:GetProviderInfo~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (capabilities :initarg :capabilities :type xcb:CARD32)
+ (num-crtcs :initarg :num-crtcs :type xcb:CARD16)
+ (num-outputs :initarg :num-outputs :type xcb:CARD16)
+ (num-associated-providers :initarg :num-associated-providers :type xcb:CARD16)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~0 :initform 8 :type xcb:-pad)
+ (crtcs~ :initform
+ '(name crtcs type xcb:randr:CRTC size
+ (xcb:-fieldref 'num-crtcs))
+ :type xcb:-list)
+ (crtcs :initarg :crtcs :type xcb:-ignore)
+ (outputs~ :initform
+ '(name outputs type xcb:randr:OUTPUT size
+ (xcb:-fieldref 'num-outputs))
+ :type xcb:-list)
+ (outputs :initarg :outputs :type xcb:-ignore)
+ (associated-providers~ :initform
+ '(name associated-providers type xcb:randr:PROVIDER size
+ (xcb:-fieldref 'num-associated-providers))
+ :type xcb:-list)
+ (associated-providers :initarg :associated-providers :type xcb:-ignore)
+ (associated-capability~ :initform
+ '(name associated-capability type xcb:CARD32 size
+ (xcb:-fieldref 'num-associated-providers))
+ :type xcb:-list)
+ (associated-capability :initarg :associated-capability :type xcb:-ignore)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:randr:SetProviderOffloadSink
+ (xcb:-request)
+ ((~opcode :initform 34 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (sink-provider :initarg :sink-provider :type xcb:randr:PROVIDER)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)))
+
+(defclass xcb:randr:SetProviderOutputSource
+ (xcb:-request)
+ ((~opcode :initform 35 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (source-provider :initarg :source-provider :type xcb:randr:PROVIDER)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)))
+
+(defclass xcb:randr:ListProviderProperties
+ (xcb:-request)
+ ((~opcode :initform 36 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)))
+(defclass xcb:randr:ListProviderProperties~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-atoms :initarg :num-atoms :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (atoms~ :initform
+ '(name atoms type xcb:ATOM size
+ (xcb:-fieldref 'num-atoms))
+ :type xcb:-list)
+ (atoms :initarg :atoms :type xcb:-ignore)))
+
+(defclass xcb:randr:QueryProviderProperty
+ (xcb:-request)
+ ((~opcode :initform 37 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (property :initarg :property :type xcb:ATOM)))
+(defclass xcb:randr:QueryProviderProperty~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pending :initarg :pending :type xcb:BOOL)
+ (range :initarg :range :type xcb:BOOL)
+ (immutable :initarg :immutable :type xcb:BOOL)
+ (pad~1 :initform 21 :type xcb:-pad)
+ (valid-values~ :initform
+ '(name valid-values type xcb:INT32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (valid-values :initarg :valid-values :type xcb:-ignore)))
+
+(defclass xcb:randr:ConfigureProviderProperty
+ (xcb:-request)
+ ((~opcode :initform 38 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (property :initarg :property :type xcb:ATOM)
+ (pending :initarg :pending :type xcb:BOOL)
+ (range :initarg :range :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (values~ :initform
+ '(name values type xcb:INT32 size nil)
+ :type xcb:-list)
+ (values :initarg :values :type xcb:-ignore)))
+
+(defclass xcb:randr:ChangeProviderProperty
+ (xcb:-request)
+ ((~opcode :initform 39 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (format :initarg :format :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (num-items :initarg :num-items :type xcb:CARD32)
+ (data~ :initform
+ '(name data type xcb:void size
+ (*
+ (xcb:-fieldref 'num-items)
+ (/
+ (xcb:-fieldref 'format)
+ 8)))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:randr:DeleteProviderProperty
+ (xcb:-request)
+ ((~opcode :initform 40 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (property :initarg :property :type xcb:ATOM)))
+
+(defclass xcb:randr:GetProviderProperty
+ (xcb:-request)
+ ((~opcode :initform 41 :type xcb:-u1)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (long-offset :initarg :long-offset :type xcb:CARD32)
+ (long-length :initarg :long-length :type xcb:CARD32)
+ (delete :initarg :delete :type xcb:BOOL)
+ (pending :initarg :pending :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:randr:GetProviderProperty~reply
+ (xcb:-reply)
+ ((format :initarg :format :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (type :initarg :type :type xcb:ATOM)
+ (bytes-after :initarg :bytes-after :type xcb:CARD32)
+ (num-items :initarg :num-items :type xcb:CARD32)
+ (pad~0 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:void size
+ (*
+ (xcb:-fieldref 'num-items)
+ (/
+ (xcb:-fieldref 'format)
+ 8)))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:randr:ScreenChangeNotify
+ (xcb:-event)
+ ((~code :initform 0)
+ (rotation :initarg :rotation :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)
+ (root :initarg :root :type xcb:WINDOW)
+ (request-window :initarg :request-window :type xcb:WINDOW)
+ (sizeID :initarg :sizeID :type xcb:CARD16)
+ (subpixel-order :initarg :subpixel-order :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (mwidth :initarg :mwidth :type xcb:CARD16)
+ (mheight :initarg :mheight :type xcb:CARD16)))
+
+(defconst xcb:randr:Notify:CrtcChange 0)
+(defconst xcb:randr:Notify:OutputChange 1)
+(defconst xcb:randr:Notify:OutputProperty 2)
+(defconst xcb:randr:Notify:ProviderChange 3)
+(defconst xcb:randr:Notify:ProviderProperty 4)
+(defconst xcb:randr:Notify:ResourceChange 5)
+(defconst xcb:randr:Notify:Lease 6)
+
+(defclass xcb:randr:CrtcChange
+ (xcb:-struct)
+ ((timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (window :initarg :window :type xcb:WINDOW)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)
+ (mode :initarg :mode :type xcb:randr:MODE)
+ (rotation :initarg :rotation :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defclass xcb:randr:OutputChange
+ (xcb:-struct)
+ ((timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (config-timestamp :initarg :config-timestamp :type xcb:TIMESTAMP)
+ (window :initarg :window :type xcb:WINDOW)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (crtc :initarg :crtc :type xcb:randr:CRTC)
+ (mode :initarg :mode :type xcb:randr:MODE)
+ (rotation :initarg :rotation :type xcb:CARD16)
+ (connection :initarg :connection :type xcb:CARD8)
+ (subpixel-order :initarg :subpixel-order :type xcb:CARD8)))
+
+(defclass xcb:randr:OutputProperty
+ (xcb:-struct)
+ ((window :initarg :window :type xcb:WINDOW)
+ (output :initarg :output :type xcb:randr:OUTPUT)
+ (atom :initarg :atom :type xcb:ATOM)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 11 :type xcb:-pad)))
+
+(defclass xcb:randr:ProviderChange
+ (xcb:-struct)
+ ((timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (window :initarg :window :type xcb:WINDOW)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (pad~0 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:randr:ProviderProperty
+ (xcb:-struct)
+ ((window :initarg :window :type xcb:WINDOW)
+ (provider :initarg :provider :type xcb:randr:PROVIDER)
+ (atom :initarg :atom :type xcb:ATOM)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (state :initarg :state :type xcb:CARD8)
+ (pad~0 :initform 11 :type xcb:-pad)))
+
+(defclass xcb:randr:ResourceChange
+ (xcb:-struct)
+ ((timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (window :initarg :window :type xcb:WINDOW)
+ (pad~0 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:randr:MonitorInfo
+ (xcb:-struct)
+ ((name :initarg :name :type xcb:ATOM)
+ (primary :initarg :primary :type xcb:BOOL)
+ (automatic :initarg :automatic :type xcb:BOOL)
+ (nOutput :initarg :nOutput :type xcb:CARD16)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (width-in-millimeters :initarg :width-in-millimeters :type xcb:CARD32)
+ (height-in-millimeters :initarg :height-in-millimeters :type xcb:CARD32)
+ (outputs~ :initform
+ '(name outputs type xcb:randr:OUTPUT size
+ (xcb:-fieldref 'nOutput))
+ :type xcb:-list)
+ (outputs :initarg :outputs :type xcb:-ignore)))
+
+(defclass xcb:randr:GetMonitors
+ (xcb:-request)
+ ((~opcode :initform 42 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (get-active :initarg :get-active :type xcb:BOOL)))
+(defclass xcb:randr:GetMonitors~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (nMonitors :initarg :nMonitors :type xcb:CARD32)
+ (nOutputs :initarg :nOutputs :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (monitors~ :initform
+ '(name monitors type xcb:randr:MonitorInfo size
+ (xcb:-fieldref 'nMonitors))
+ :type xcb:-list)
+ (monitors :initarg :monitors :type xcb:-ignore)))
+
+(defclass xcb:randr:SetMonitor
+ (xcb:-request)
+ ((~opcode :initform 43 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (monitorinfo :initarg :monitorinfo :type xcb:randr:MonitorInfo)))
+
+(defclass xcb:randr:DeleteMonitor
+ (xcb:-request)
+ ((~opcode :initform 44 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (name :initarg :name :type xcb:ATOM)))
+
+(defclass xcb:randr:CreateLease
+ (xcb:-request)
+ ((~opcode :initform 45 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (lid :initarg :lid :type xcb:randr:LEASE)
+ (num-crtcs :initarg :num-crtcs :type xcb:CARD16)
+ (num-outputs :initarg :num-outputs :type xcb:CARD16)
+ (crtcs~ :initform
+ '(name crtcs type xcb:randr:CRTC size
+ (xcb:-fieldref 'num-crtcs))
+ :type xcb:-list)
+ (crtcs :initarg :crtcs :type xcb:-ignore)
+ (outputs~ :initform
+ '(name outputs type xcb:randr:OUTPUT size
+ (xcb:-fieldref 'num-outputs))
+ :type xcb:-list)
+ (outputs :initarg :outputs :type xcb:-ignore)))
+(defclass xcb:randr:CreateLease~reply
+ (xcb:-reply)
+ ((nfd :initarg :nfd :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (master-fd :type xcb:fd)
+ (pad~0 :initform 24 :type xcb:-pad)))
+
+(defclass xcb:randr:FreeLease
+ (xcb:-request)
+ ((~opcode :initform 46 :type xcb:-u1)
+ (lid :initarg :lid :type xcb:randr:LEASE)
+ (terminate :initarg :terminate :type xcb:BYTE)))
+
+(defclass xcb:randr:LeaseNotify
+ (xcb:-struct)
+ ((timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (window :initarg :window :type xcb:WINDOW)
+ (lease :initarg :lease :type xcb:randr:LEASE)
+ (created :initarg :created :type xcb:CARD8)
+ (pad~0 :initform 15 :type xcb:-pad)))
+
+(defclass xcb:randr:NotifyData
+ (xcb:-union)
+ ((~size :initform 28)
+ (cc :initarg :cc :type xcb:randr:CrtcChange)
+ (oc :initarg :oc :type xcb:randr:OutputChange)
+ (op :initarg :op :type xcb:randr:OutputProperty)
+ (pc :initarg :pc :type xcb:randr:ProviderChange)
+ (pp :initarg :pp :type xcb:randr:ProviderProperty)
+ (rc :initarg :rc :type xcb:randr:ResourceChange)
+ (lc :initarg :lc :type xcb:randr:LeaseNotify)))
+
+(defclass xcb:randr:Notify
+ (xcb:-event)
+ ((~code :initform 1)
+ (subCode :initarg :subCode :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (u :initarg :u :type xcb:randr:NotifyData)))
+
+(defconst xcb:randr:error-number-class-alist
+ '((0 . xcb:randr:BadOutput)
+ (1 . xcb:randr:BadCrtc)
+ (2 . xcb:randr:BadMode)
+ (3 . xcb:randr:BadProvider))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:randr:event-number-class-alist
+ '((0 . xcb:randr:ScreenChangeNotify)
+ (1 . xcb:randr:Notify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-randr)
+
+;;; xcb-randr.el ends here
diff --git a/elpa/xelb-0.20/xcb-randr.elc b/elpa/xelb-0.20/xcb-randr.elc
new file mode 100644
index 0000000..23e2ca1
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-randr.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-record.el b/elpa/xelb-0.20/xcb-record.el
new file mode 100644
index 0000000..8afc5d4
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-record.el
@@ -0,0 +1,213 @@
+;;; xcb-record.el --- X11 Record extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'record.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:record:-extension-xname "RECORD")
+(defconst xcb:record:-extension-name "Record")
+(defconst xcb:record:-major-version 1)
+(defconst xcb:record:-minor-version 13)
+
+(xcb:deftypealias 'xcb:record:CONTEXT 'xcb:-u4)
+
+(defclass xcb:record:Range8
+ (xcb:-struct)
+ ((first :initarg :first :type xcb:CARD8)
+ (last :initarg :last :type xcb:CARD8)))
+
+(defclass xcb:record:Range16
+ (xcb:-struct)
+ ((first :initarg :first :type xcb:CARD16)
+ (last :initarg :last :type xcb:CARD16)))
+
+(defclass xcb:record:ExtRange
+ (xcb:-struct)
+ ((major :initarg :major :type xcb:record:Range8)
+ (minor :initarg :minor :type xcb:record:Range16)))
+
+(defclass xcb:record:Range
+ (xcb:-struct)
+ ((core-requests :initarg :core-requests :type xcb:record:Range8)
+ (core-replies :initarg :core-replies :type xcb:record:Range8)
+ (ext-requests :initarg :ext-requests :type xcb:record:ExtRange)
+ (ext-replies :initarg :ext-replies :type xcb:record:ExtRange)
+ (delivered-events :initarg :delivered-events :type xcb:record:Range8)
+ (device-events :initarg :device-events :type xcb:record:Range8)
+ (errors :initarg :errors :type xcb:record:Range8)
+ (client-started :initarg :client-started :type xcb:BOOL)
+ (client-died :initarg :client-died :type xcb:BOOL)))
+
+(xcb:deftypealias 'xcb:record:ElementHeader 'xcb:CARD8)
+
+(defconst xcb:record:HType:FromServerTime 1)
+(defconst xcb:record:HType:FromClientTime 2)
+(defconst xcb:record:HType:FromClientSequence 4)
+
+(xcb:deftypealias 'xcb:record:ClientSpec 'xcb:CARD32)
+
+(defconst xcb:record:CS:CurrentClients 1)
+(defconst xcb:record:CS:FutureClients 2)
+(defconst xcb:record:CS:AllClients 3)
+
+(defclass xcb:record:ClientInfo
+ (xcb:-struct)
+ ((client-resource :initarg :client-resource :type xcb:record:ClientSpec)
+ (num-ranges :initarg :num-ranges :type xcb:CARD32)
+ (ranges~ :initform
+ '(name ranges type xcb:record:Range size
+ (xcb:-fieldref 'num-ranges))
+ :type xcb:-list)
+ (ranges :initarg :ranges :type xcb:-ignore)))
+
+(defclass xcb:record:BadContext
+ (xcb:-error)
+ ((~code :initform 0)
+ (invalid-record :initarg :invalid-record :type xcb:CARD32)))
+
+(defclass xcb:record:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)))
+(defclass xcb:record:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)))
+
+(defclass xcb:record:CreateContext
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (context :initarg :context :type xcb:record:CONTEXT)
+ (element-header :initarg :element-header :type xcb:record:ElementHeader)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (num-client-specs :initarg :num-client-specs :type xcb:CARD32)
+ (num-ranges :initarg :num-ranges :type xcb:CARD32)
+ (client-specs~ :initform
+ '(name client-specs type xcb:record:ClientSpec size
+ (xcb:-fieldref 'num-client-specs))
+ :type xcb:-list)
+ (client-specs :initarg :client-specs :type xcb:-ignore)
+ (ranges~ :initform
+ '(name ranges type xcb:record:Range size
+ (xcb:-fieldref 'num-ranges))
+ :type xcb:-list)
+ (ranges :initarg :ranges :type xcb:-ignore)))
+
+(defclass xcb:record:RegisterClients
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (context :initarg :context :type xcb:record:CONTEXT)
+ (element-header :initarg :element-header :type xcb:record:ElementHeader)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (num-client-specs :initarg :num-client-specs :type xcb:CARD32)
+ (num-ranges :initarg :num-ranges :type xcb:CARD32)
+ (client-specs~ :initform
+ '(name client-specs type xcb:record:ClientSpec size
+ (xcb:-fieldref 'num-client-specs))
+ :type xcb:-list)
+ (client-specs :initarg :client-specs :type xcb:-ignore)
+ (ranges~ :initform
+ '(name ranges type xcb:record:Range size
+ (xcb:-fieldref 'num-ranges))
+ :type xcb:-list)
+ (ranges :initarg :ranges :type xcb:-ignore)))
+
+(defclass xcb:record:UnregisterClients
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (context :initarg :context :type xcb:record:CONTEXT)
+ (num-client-specs :initarg :num-client-specs :type xcb:CARD32)
+ (client-specs~ :initform
+ '(name client-specs type xcb:record:ClientSpec size
+ (xcb:-fieldref 'num-client-specs))
+ :type xcb:-list)
+ (client-specs :initarg :client-specs :type xcb:-ignore)))
+
+(defclass xcb:record:GetContext
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (context :initarg :context :type xcb:record:CONTEXT)))
+(defclass xcb:record:GetContext~reply
+ (xcb:-reply)
+ ((enabled :initarg :enabled :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (element-header :initarg :element-header :type xcb:record:ElementHeader)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (num-intercepted-clients :initarg :num-intercepted-clients :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)
+ (intercepted-clients~ :initform
+ '(name intercepted-clients type xcb:record:ClientInfo size
+ (xcb:-fieldref 'num-intercepted-clients))
+ :type xcb:-list)
+ (intercepted-clients :initarg :intercepted-clients :type xcb:-ignore)))
+
+(defclass xcb:record:EnableContext
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (context :initarg :context :type xcb:record:CONTEXT)))
+(defclass xcb:record:EnableContext~reply
+ (xcb:-reply)
+ ((category :initarg :category :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (element-header :initarg :element-header :type xcb:record:ElementHeader)
+ (client-swapped :initarg :client-swapped :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (xid-base :initarg :xid-base :type xcb:CARD32)
+ (server-time :initarg :server-time :type xcb:CARD32)
+ (rec-sequence-num :initarg :rec-sequence-num :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:record:DisableContext
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (context :initarg :context :type xcb:record:CONTEXT)))
+
+(defclass xcb:record:FreeContext
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (context :initarg :context :type xcb:record:CONTEXT)))
+
+(defconst xcb:record:error-number-class-alist
+ '((0 . xcb:record:BadContext))
+ "(error-number . error-class) alist.")
+
+
+
+(provide 'xcb-record)
+
+;;; xcb-record.el ends here
diff --git a/elpa/xelb-0.20/xcb-record.elc b/elpa/xelb-0.20/xcb-record.elc
new file mode 100644
index 0000000..8befa56
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-record.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-render.el b/elpa/xelb-0.20/xcb-render.el
new file mode 100644
index 0000000..690611c
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-render.el
@@ -0,0 +1,763 @@
+;;; xcb-render.el --- X11 Render extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'render.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:render:-extension-xname "RENDER")
+(defconst xcb:render:-extension-name "Render")
+(defconst xcb:render:-major-version 0)
+(defconst xcb:render:-minor-version 11)
+
+(require 'xcb-xproto)
+
+(defconst xcb:render:PictType:Indexed 0)
+(defconst xcb:render:PictType:Direct 1)
+
+(defconst xcb:render:Picture:None 0)
+
+(defconst xcb:render:PictOp:Clear 0)
+(defconst xcb:render:PictOp:Src 1)
+(defconst xcb:render:PictOp:Dst 2)
+(defconst xcb:render:PictOp:Over 3)
+(defconst xcb:render:PictOp:OverReverse 4)
+(defconst xcb:render:PictOp:In 5)
+(defconst xcb:render:PictOp:InReverse 6)
+(defconst xcb:render:PictOp:Out 7)
+(defconst xcb:render:PictOp:OutReverse 8)
+(defconst xcb:render:PictOp:Atop 9)
+(defconst xcb:render:PictOp:AtopReverse 10)
+(defconst xcb:render:PictOp:Xor 11)
+(defconst xcb:render:PictOp:Add 12)
+(defconst xcb:render:PictOp:Saturate 13)
+(defconst xcb:render:PictOp:DisjointClear 16)
+(defconst xcb:render:PictOp:DisjointSrc 17)
+(defconst xcb:render:PictOp:DisjointDst 18)
+(defconst xcb:render:PictOp:DisjointOver 19)
+(defconst xcb:render:PictOp:DisjointOverReverse 20)
+(defconst xcb:render:PictOp:DisjointIn 21)
+(defconst xcb:render:PictOp:DisjointInReverse 22)
+(defconst xcb:render:PictOp:DisjointOut 23)
+(defconst xcb:render:PictOp:DisjointOutReverse 24)
+(defconst xcb:render:PictOp:DisjointAtop 25)
+(defconst xcb:render:PictOp:DisjointAtopReverse 26)
+(defconst xcb:render:PictOp:DisjointXor 27)
+(defconst xcb:render:PictOp:ConjointClear 32)
+(defconst xcb:render:PictOp:ConjointSrc 33)
+(defconst xcb:render:PictOp:ConjointDst 34)
+(defconst xcb:render:PictOp:ConjointOver 35)
+(defconst xcb:render:PictOp:ConjointOverReverse 36)
+(defconst xcb:render:PictOp:ConjointIn 37)
+(defconst xcb:render:PictOp:ConjointInReverse 38)
+(defconst xcb:render:PictOp:ConjointOut 39)
+(defconst xcb:render:PictOp:ConjointOutReverse 40)
+(defconst xcb:render:PictOp:ConjointAtop 41)
+(defconst xcb:render:PictOp:ConjointAtopReverse 42)
+(defconst xcb:render:PictOp:ConjointXor 43)
+(defconst xcb:render:PictOp:Multiply 48)
+(defconst xcb:render:PictOp:Screen 49)
+(defconst xcb:render:PictOp:Overlay 50)
+(defconst xcb:render:PictOp:Darken 51)
+(defconst xcb:render:PictOp:Lighten 52)
+(defconst xcb:render:PictOp:ColorDodge 53)
+(defconst xcb:render:PictOp:ColorBurn 54)
+(defconst xcb:render:PictOp:HardLight 55)
+(defconst xcb:render:PictOp:SoftLight 56)
+(defconst xcb:render:PictOp:Difference 57)
+(defconst xcb:render:PictOp:Exclusion 58)
+(defconst xcb:render:PictOp:HSLHue 59)
+(defconst xcb:render:PictOp:HSLSaturation 60)
+(defconst xcb:render:PictOp:HSLColor 61)
+(defconst xcb:render:PictOp:HSLLuminosity 62)
+
+(defconst xcb:render:PolyEdge:Sharp 0)
+(defconst xcb:render:PolyEdge:Smooth 1)
+
+(defconst xcb:render:PolyMode:Precise 0)
+(defconst xcb:render:PolyMode:Imprecise 1)
+
+(defconst xcb:render:CP:Repeat 1)
+(defconst xcb:render:CP:AlphaMap 2)
+(defconst xcb:render:CP:AlphaXOrigin 4)
+(defconst xcb:render:CP:AlphaYOrigin 8)
+(defconst xcb:render:CP:ClipXOrigin 16)
+(defconst xcb:render:CP:ClipYOrigin 32)
+(defconst xcb:render:CP:ClipMask 64)
+(defconst xcb:render:CP:GraphicsExposure 128)
+(defconst xcb:render:CP:SubwindowMode 256)
+(defconst xcb:render:CP:PolyEdge 512)
+(defconst xcb:render:CP:PolyMode 1024)
+(defconst xcb:render:CP:Dither 2048)
+(defconst xcb:render:CP:ComponentAlpha 4096)
+
+(defconst xcb:render:SubPixel:Unknown 0)
+(defconst xcb:render:SubPixel:HorizontalRGB 1)
+(defconst xcb:render:SubPixel:HorizontalBGR 2)
+(defconst xcb:render:SubPixel:VerticalRGB 3)
+(defconst xcb:render:SubPixel:VerticalBGR 4)
+(defconst xcb:render:SubPixel:None 5)
+
+(defconst xcb:render:Repeat:None 0)
+(defconst xcb:render:Repeat:Normal 1)
+(defconst xcb:render:Repeat:Pad 2)
+(defconst xcb:render:Repeat:Reflect 3)
+
+(xcb:deftypealias 'xcb:render:GLYPH 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:render:GLYPHSET 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:render:PICTURE 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:render:PICTFORMAT 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:render:FIXED 'xcb:INT32)
+
+(defclass xcb:render:PictFormat
+ (xcb:-error)
+ ((~code :initform 0)))
+
+(defclass xcb:render:Picture
+ (xcb:-error)
+ ((~code :initform 1)))
+
+(defclass xcb:render:PictOp
+ (xcb:-error)
+ ((~code :initform 2)))
+
+(defclass xcb:render:GlyphSet
+ (xcb:-error)
+ ((~code :initform 3)))
+
+(defclass xcb:render:Glyph
+ (xcb:-error)
+ ((~code :initform 4)))
+
+(defclass xcb:render:DIRECTFORMAT
+ (xcb:-struct)
+ ((red-shift :initarg :red-shift :type xcb:CARD16)
+ (red-mask :initarg :red-mask :type xcb:CARD16)
+ (green-shift :initarg :green-shift :type xcb:CARD16)
+ (green-mask :initarg :green-mask :type xcb:CARD16)
+ (blue-shift :initarg :blue-shift :type xcb:CARD16)
+ (blue-mask :initarg :blue-mask :type xcb:CARD16)
+ (alpha-shift :initarg :alpha-shift :type xcb:CARD16)
+ (alpha-mask :initarg :alpha-mask :type xcb:CARD16)))
+
+(defclass xcb:render:PICTFORMINFO
+ (xcb:-struct)
+ ((id :initarg :id :type xcb:render:PICTFORMAT)
+ (type :initarg :type :type xcb:CARD8)
+ (depth :initarg :depth :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (direct :initarg :direct :type xcb:render:DIRECTFORMAT)
+ (colormap :initarg :colormap :type xcb:COLORMAP)))
+
+(defclass xcb:render:PICTVISUAL
+ (xcb:-struct)
+ ((visual :initarg :visual :type xcb:VISUALID)
+ (format :initarg :format :type xcb:render:PICTFORMAT)))
+
+(defclass xcb:render:PICTDEPTH
+ (xcb:-struct)
+ ((depth :initarg :depth :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (num-visuals :initarg :num-visuals :type xcb:CARD16)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (visuals~ :initform
+ '(name visuals type xcb:render:PICTVISUAL size
+ (xcb:-fieldref 'num-visuals))
+ :type xcb:-list)
+ (visuals :initarg :visuals :type xcb:-ignore)))
+
+(defclass xcb:render:PICTSCREEN
+ (xcb:-struct)
+ ((num-depths :initarg :num-depths :type xcb:CARD32)
+ (fallback :initarg :fallback :type xcb:render:PICTFORMAT)
+ (depths~ :initform
+ '(name depths type xcb:render:PICTDEPTH size
+ (xcb:-fieldref 'num-depths))
+ :type xcb:-list)
+ (depths :initarg :depths :type xcb:-ignore)))
+
+(defclass xcb:render:INDEXVALUE
+ (xcb:-struct)
+ ((pixel :initarg :pixel :type xcb:CARD32)
+ (red :initarg :red :type xcb:CARD16)
+ (green :initarg :green :type xcb:CARD16)
+ (blue :initarg :blue :type xcb:CARD16)
+ (alpha :initarg :alpha :type xcb:CARD16)))
+
+(defclass xcb:render:COLOR
+ (xcb:-struct)
+ ((red :initarg :red :type xcb:CARD16)
+ (green :initarg :green :type xcb:CARD16)
+ (blue :initarg :blue :type xcb:CARD16)
+ (alpha :initarg :alpha :type xcb:CARD16)))
+
+(defclass xcb:render:POINTFIX
+ (xcb:-struct)
+ ((x :initarg :x :type xcb:render:FIXED)
+ (y :initarg :y :type xcb:render:FIXED)))
+
+(defclass xcb:render:LINEFIX
+ (xcb:-struct)
+ ((p1 :initarg :p1 :type xcb:render:POINTFIX)
+ (p2 :initarg :p2 :type xcb:render:POINTFIX)))
+
+(defclass xcb:render:TRIANGLE
+ (xcb:-struct)
+ ((p1 :initarg :p1 :type xcb:render:POINTFIX)
+ (p2 :initarg :p2 :type xcb:render:POINTFIX)
+ (p3 :initarg :p3 :type xcb:render:POINTFIX)))
+
+(defclass xcb:render:TRAPEZOID
+ (xcb:-struct)
+ ((top :initarg :top :type xcb:render:FIXED)
+ (bottom :initarg :bottom :type xcb:render:FIXED)
+ (left :initarg :left :type xcb:render:LINEFIX)
+ (right :initarg :right :type xcb:render:LINEFIX)))
+
+(defclass xcb:render:GLYPHINFO
+ (xcb:-struct)
+ ((width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (x-off :initarg :x-off :type xcb:INT16)
+ (y-off :initarg :y-off :type xcb:INT16)))
+
+(defclass xcb:render:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD32)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD32)))
+(defclass xcb:render:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:render:QueryPictFormats
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)))
+(defclass xcb:render:QueryPictFormats~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-formats :initarg :num-formats :type xcb:CARD32)
+ (num-screens :initarg :num-screens :type xcb:CARD32)
+ (num-depths :initarg :num-depths :type xcb:CARD32)
+ (num-visuals :initarg :num-visuals :type xcb:CARD32)
+ (num-subpixel :initarg :num-subpixel :type xcb:CARD32)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (formats~ :initform
+ '(name formats type xcb:render:PICTFORMINFO size
+ (xcb:-fieldref 'num-formats))
+ :type xcb:-list)
+ (formats :initarg :formats :type xcb:-ignore)
+ (screens~ :initform
+ '(name screens type xcb:render:PICTSCREEN size
+ (xcb:-fieldref 'num-screens))
+ :type xcb:-list)
+ (screens :initarg :screens :type xcb:-ignore)
+ (subpixels~ :initform
+ '(name subpixels type xcb:CARD32 size
+ (xcb:-fieldref 'num-subpixel))
+ :type xcb:-list)
+ (subpixels :initarg :subpixels :type xcb:-ignore)))
+
+(defclass xcb:render:QueryPictIndexValues
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (format :initarg :format :type xcb:render:PICTFORMAT)))
+(defclass xcb:render:QueryPictIndexValues~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-values :initarg :num-values :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (values~ :initform
+ '(name values type xcb:render:INDEXVALUE size
+ (xcb:-fieldref 'num-values))
+ :type xcb:-list)
+ (values :initarg :values :type xcb:-ignore)))
+
+(defclass xcb:render:CreatePicture
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (pid :initarg :pid :type xcb:render:PICTURE)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (format :initarg :format :type xcb:render:PICTFORMAT)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 repeat)
+ (2 alphamap)
+ (4 alphaxorigin)
+ (8 alphayorigin)
+ (16 clipxorigin)
+ (32 clipyorigin)
+ (64 clipmask)
+ (128 graphicsexposure)
+ (256 subwindowmode)
+ (512 polyedge)
+ (1024 polymode)
+ (2048 dither)
+ (4096 componentalpha)))
+ :type xcb:-switch)
+ (repeat :initarg :repeat :type xcb:CARD32)
+ (alphamap :initarg :alphamap :type xcb:render:PICTURE)
+ (alphaxorigin :initarg :alphaxorigin :type xcb:INT32)
+ (alphayorigin :initarg :alphayorigin :type xcb:INT32)
+ (clipxorigin :initarg :clipxorigin :type xcb:INT32)
+ (clipyorigin :initarg :clipyorigin :type xcb:INT32)
+ (clipmask :initarg :clipmask :type xcb:PIXMAP)
+ (graphicsexposure :initarg :graphicsexposure :type xcb:CARD32)
+ (subwindowmode :initarg :subwindowmode :type xcb:CARD32)
+ (polyedge :initarg :polyedge :type xcb:CARD32)
+ (polymode :initarg :polymode :type xcb:CARD32)
+ (dither :initarg :dither :type xcb:ATOM)
+ (componentalpha :initarg :componentalpha :type xcb:CARD32)))
+
+(defclass xcb:render:ChangePicture
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 repeat)
+ (2 alphamap)
+ (4 alphaxorigin)
+ (8 alphayorigin)
+ (16 clipxorigin)
+ (32 clipyorigin)
+ (64 clipmask)
+ (128 graphicsexposure)
+ (256 subwindowmode)
+ (512 polyedge)
+ (1024 polymode)
+ (2048 dither)
+ (4096 componentalpha)))
+ :type xcb:-switch)
+ (repeat :initarg :repeat :type xcb:CARD32)
+ (alphamap :initarg :alphamap :type xcb:render:PICTURE)
+ (alphaxorigin :initarg :alphaxorigin :type xcb:INT32)
+ (alphayorigin :initarg :alphayorigin :type xcb:INT32)
+ (clipxorigin :initarg :clipxorigin :type xcb:INT32)
+ (clipyorigin :initarg :clipyorigin :type xcb:INT32)
+ (clipmask :initarg :clipmask :type xcb:PIXMAP)
+ (graphicsexposure :initarg :graphicsexposure :type xcb:CARD32)
+ (subwindowmode :initarg :subwindowmode :type xcb:CARD32)
+ (polyedge :initarg :polyedge :type xcb:CARD32)
+ (polymode :initarg :polymode :type xcb:CARD32)
+ (dither :initarg :dither :type xcb:ATOM)
+ (componentalpha :initarg :componentalpha :type xcb:CARD32)))
+
+(defclass xcb:render:SetPictureClipRectangles
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (clip-x-origin :initarg :clip-x-origin :type xcb:INT16)
+ (clip-y-origin :initarg :clip-y-origin :type xcb:INT16)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size nil)
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defclass xcb:render:FreePicture
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)))
+
+(defclass xcb:render:Composite
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (src :initarg :src :type xcb:render:PICTURE)
+ (mask :initarg :mask :type xcb:render:PICTURE)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (mask-x :initarg :mask-x :type xcb:INT16)
+ (mask-y :initarg :mask-y :type xcb:INT16)
+ (dst-x :initarg :dst-x :type xcb:INT16)
+ (dst-y :initarg :dst-y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defclass xcb:render:Trapezoids
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (src :initarg :src :type xcb:render:PICTURE)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (mask-format :initarg :mask-format :type xcb:render:PICTFORMAT)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (traps~ :initform
+ '(name traps type xcb:render:TRAPEZOID size nil)
+ :type xcb:-list)
+ (traps :initarg :traps :type xcb:-ignore)))
+
+(defclass xcb:render:Triangles
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (src :initarg :src :type xcb:render:PICTURE)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (mask-format :initarg :mask-format :type xcb:render:PICTFORMAT)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (triangles~ :initform
+ '(name triangles type xcb:render:TRIANGLE size nil)
+ :type xcb:-list)
+ (triangles :initarg :triangles :type xcb:-ignore)))
+
+(defclass xcb:render:TriStrip
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (src :initarg :src :type xcb:render:PICTURE)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (mask-format :initarg :mask-format :type xcb:render:PICTFORMAT)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (points~ :initform
+ '(name points type xcb:render:POINTFIX size nil)
+ :type xcb:-list)
+ (points :initarg :points :type xcb:-ignore)))
+
+(defclass xcb:render:TriFan
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (src :initarg :src :type xcb:render:PICTURE)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (mask-format :initarg :mask-format :type xcb:render:PICTFORMAT)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (points~ :initform
+ '(name points type xcb:render:POINTFIX size nil)
+ :type xcb:-list)
+ (points :initarg :points :type xcb:-ignore)))
+
+(defclass xcb:render:CreateGlyphSet
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (gsid :initarg :gsid :type xcb:render:GLYPHSET)
+ (format :initarg :format :type xcb:render:PICTFORMAT)))
+
+(defclass xcb:render:ReferenceGlyphSet
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (gsid :initarg :gsid :type xcb:render:GLYPHSET)
+ (existing :initarg :existing :type xcb:render:GLYPHSET)))
+
+(defclass xcb:render:FreeGlyphSet
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (glyphset :initarg :glyphset :type xcb:render:GLYPHSET)))
+
+(defclass xcb:render:AddGlyphs
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)
+ (glyphset :initarg :glyphset :type xcb:render:GLYPHSET)
+ (glyphs-len :initarg :glyphs-len :type xcb:CARD32)
+ (glyphids~ :initform
+ '(name glyphids type xcb:CARD32 size
+ (xcb:-fieldref 'glyphs-len))
+ :type xcb:-list)
+ (glyphids :initarg :glyphids :type xcb:-ignore)
+ (glyphs~ :initform
+ '(name glyphs type xcb:render:GLYPHINFO size
+ (xcb:-fieldref 'glyphs-len))
+ :type xcb:-list)
+ (glyphs :initarg :glyphs :type xcb:-ignore)
+ (data~ :initform
+ '(name data type xcb:BYTE size nil)
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:render:FreeGlyphs
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)
+ (glyphset :initarg :glyphset :type xcb:render:GLYPHSET)
+ (glyphs~ :initform
+ '(name glyphs type xcb:render:GLYPH size nil)
+ :type xcb:-list)
+ (glyphs :initarg :glyphs :type xcb:-ignore)))
+
+(defclass xcb:render:CompositeGlyphs8
+ (xcb:-request)
+ ((~opcode :initform 23 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (src :initarg :src :type xcb:render:PICTURE)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (mask-format :initarg :mask-format :type xcb:render:PICTFORMAT)
+ (glyphset :initarg :glyphset :type xcb:render:GLYPHSET)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (glyphcmds~ :initform
+ '(name glyphcmds type xcb:BYTE size nil)
+ :type xcb:-list)
+ (glyphcmds :initarg :glyphcmds :type xcb:-ignore)))
+
+(defclass xcb:render:CompositeGlyphs16
+ (xcb:-request)
+ ((~opcode :initform 24 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (src :initarg :src :type xcb:render:PICTURE)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (mask-format :initarg :mask-format :type xcb:render:PICTFORMAT)
+ (glyphset :initarg :glyphset :type xcb:render:GLYPHSET)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (glyphcmds~ :initform
+ '(name glyphcmds type xcb:BYTE size nil)
+ :type xcb:-list)
+ (glyphcmds :initarg :glyphcmds :type xcb:-ignore)))
+
+(defclass xcb:render:CompositeGlyphs32
+ (xcb:-request)
+ ((~opcode :initform 25 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (src :initarg :src :type xcb:render:PICTURE)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (mask-format :initarg :mask-format :type xcb:render:PICTFORMAT)
+ (glyphset :initarg :glyphset :type xcb:render:GLYPHSET)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (glyphcmds~ :initform
+ '(name glyphcmds type xcb:BYTE size nil)
+ :type xcb:-list)
+ (glyphcmds :initarg :glyphcmds :type xcb:-ignore)))
+
+(defclass xcb:render:FillRectangles
+ (xcb:-request)
+ ((~opcode :initform 26 :type xcb:-u1)
+ (op :initarg :op :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (dst :initarg :dst :type xcb:render:PICTURE)
+ (color :initarg :color :type xcb:render:COLOR)
+ (rects~ :initform
+ '(name rects type xcb:RECTANGLE size nil)
+ :type xcb:-list)
+ (rects :initarg :rects :type xcb:-ignore)))
+
+(defclass xcb:render:CreateCursor
+ (xcb:-request)
+ ((~opcode :initform 27 :type xcb:-u1)
+ (cid :initarg :cid :type xcb:CURSOR)
+ (source :initarg :source :type xcb:render:PICTURE)
+ (x :initarg :x :type xcb:CARD16)
+ (y :initarg :y :type xcb:CARD16)))
+
+(defclass xcb:render:TRANSFORM
+ (xcb:-struct)
+ ((matrix11 :initarg :matrix11 :type xcb:render:FIXED)
+ (matrix12 :initarg :matrix12 :type xcb:render:FIXED)
+ (matrix13 :initarg :matrix13 :type xcb:render:FIXED)
+ (matrix21 :initarg :matrix21 :type xcb:render:FIXED)
+ (matrix22 :initarg :matrix22 :type xcb:render:FIXED)
+ (matrix23 :initarg :matrix23 :type xcb:render:FIXED)
+ (matrix31 :initarg :matrix31 :type xcb:render:FIXED)
+ (matrix32 :initarg :matrix32 :type xcb:render:FIXED)
+ (matrix33 :initarg :matrix33 :type xcb:render:FIXED)))
+
+(defclass xcb:render:SetPictureTransform
+ (xcb:-request)
+ ((~opcode :initform 28 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (transform :initarg :transform :type xcb:render:TRANSFORM)))
+
+(defclass xcb:render:QueryFilters
+ (xcb:-request)
+ ((~opcode :initform 29 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+(defclass xcb:render:QueryFilters~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-aliases :initarg :num-aliases :type xcb:CARD32)
+ (num-filters :initarg :num-filters :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)
+ (aliases~ :initform
+ '(name aliases type xcb:CARD16 size
+ (xcb:-fieldref 'num-aliases))
+ :type xcb:-list)
+ (aliases :initarg :aliases :type xcb:-ignore)
+ (filters~ :initform
+ '(name filters type xcb:STR size
+ (xcb:-fieldref 'num-filters))
+ :type xcb:-list)
+ (filters :initarg :filters :type xcb:-ignore)))
+
+(defclass xcb:render:SetPictureFilter
+ (xcb:-request)
+ ((~opcode :initform 30 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (filter-len :initarg :filter-len :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (filter~ :initform
+ '(name filter type xcb:char size
+ (xcb:-fieldref 'filter-len))
+ :type xcb:-list)
+ (filter :initarg :filter :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (values~ :initform
+ '(name values type xcb:render:FIXED size nil)
+ :type xcb:-list)
+ (values :initarg :values :type xcb:-ignore)))
+
+(defclass xcb:render:ANIMCURSORELT
+ (xcb:-struct)
+ ((cursor :initarg :cursor :type xcb:CURSOR)
+ (delay :initarg :delay :type xcb:CARD32)))
+
+(defclass xcb:render:CreateAnimCursor
+ (xcb:-request)
+ ((~opcode :initform 31 :type xcb:-u1)
+ (cid :initarg :cid :type xcb:CURSOR)
+ (cursors~ :initform
+ '(name cursors type xcb:render:ANIMCURSORELT size nil)
+ :type xcb:-list)
+ (cursors :initarg :cursors :type xcb:-ignore)))
+
+(defclass xcb:render:SPANFIX
+ (xcb:-struct)
+ ((l :initarg :l :type xcb:render:FIXED)
+ (r :initarg :r :type xcb:render:FIXED)
+ (y :initarg :y :type xcb:render:FIXED)))
+
+(defclass xcb:render:TRAP
+ (xcb:-struct)
+ ((top :initarg :top :type xcb:render:SPANFIX)
+ (bot :initarg :bot :type xcb:render:SPANFIX)))
+
+(defclass xcb:render:AddTraps
+ (xcb:-request)
+ ((~opcode :initform 32 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (x-off :initarg :x-off :type xcb:INT16)
+ (y-off :initarg :y-off :type xcb:INT16)
+ (traps~ :initform
+ '(name traps type xcb:render:TRAP size nil)
+ :type xcb:-list)
+ (traps :initarg :traps :type xcb:-ignore)))
+
+(defclass xcb:render:CreateSolidFill
+ (xcb:-request)
+ ((~opcode :initform 33 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (color :initarg :color :type xcb:render:COLOR)))
+
+(defclass xcb:render:CreateLinearGradient
+ (xcb:-request)
+ ((~opcode :initform 34 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (p1 :initarg :p1 :type xcb:render:POINTFIX)
+ (p2 :initarg :p2 :type xcb:render:POINTFIX)
+ (num-stops :initarg :num-stops :type xcb:CARD32)
+ (stops~ :initform
+ '(name stops type xcb:render:FIXED size
+ (xcb:-fieldref 'num-stops))
+ :type xcb:-list)
+ (stops :initarg :stops :type xcb:-ignore)
+ (colors~ :initform
+ '(name colors type xcb:render:COLOR size
+ (xcb:-fieldref 'num-stops))
+ :type xcb:-list)
+ (colors :initarg :colors :type xcb:-ignore)))
+
+(defclass xcb:render:CreateRadialGradient
+ (xcb:-request)
+ ((~opcode :initform 35 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (inner :initarg :inner :type xcb:render:POINTFIX)
+ (outer :initarg :outer :type xcb:render:POINTFIX)
+ (inner-radius :initarg :inner-radius :type xcb:render:FIXED)
+ (outer-radius :initarg :outer-radius :type xcb:render:FIXED)
+ (num-stops :initarg :num-stops :type xcb:CARD32)
+ (stops~ :initform
+ '(name stops type xcb:render:FIXED size
+ (xcb:-fieldref 'num-stops))
+ :type xcb:-list)
+ (stops :initarg :stops :type xcb:-ignore)
+ (colors~ :initform
+ '(name colors type xcb:render:COLOR size
+ (xcb:-fieldref 'num-stops))
+ :type xcb:-list)
+ (colors :initarg :colors :type xcb:-ignore)))
+
+(defclass xcb:render:CreateConicalGradient
+ (xcb:-request)
+ ((~opcode :initform 36 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (center :initarg :center :type xcb:render:POINTFIX)
+ (angle :initarg :angle :type xcb:render:FIXED)
+ (num-stops :initarg :num-stops :type xcb:CARD32)
+ (stops~ :initform
+ '(name stops type xcb:render:FIXED size
+ (xcb:-fieldref 'num-stops))
+ :type xcb:-list)
+ (stops :initarg :stops :type xcb:-ignore)
+ (colors~ :initform
+ '(name colors type xcb:render:COLOR size
+ (xcb:-fieldref 'num-stops))
+ :type xcb:-list)
+ (colors :initarg :colors :type xcb:-ignore)))
+
+(defconst xcb:render:error-number-class-alist
+ '((0 . xcb:render:PictFormat)
+ (1 . xcb:render:Picture)
+ (2 . xcb:render:PictOp)
+ (3 . xcb:render:GlyphSet)
+ (4 . xcb:render:Glyph))
+ "(error-number . error-class) alist.")
+
+
+
+(provide 'xcb-render)
+
+;;; xcb-render.el ends here
diff --git a/elpa/xelb-0.20/xcb-render.elc b/elpa/xelb-0.20/xcb-render.elc
new file mode 100644
index 0000000..c4d3f8d
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-render.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-renderutil.el b/elpa/xelb-0.20/xcb-renderutil.el
new file mode 100644
index 0000000..6e7f9f3
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-renderutil.el
@@ -0,0 +1,296 @@
+;;; xcb-renderutil.el --- Utility functions for -*- lexical-binding: t -*-
+;;; the Render extension
+
+;; Copyright (C) 2016-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library provides utility functions for the Render extension.
+
+;; Todo
+;; + Glyph-related functions are not implemented.
+
+;; References:
+;; + xcb/util-renderutil (git://anongit.freedesktop.org/xcb/util-renderutil)
+
+;;; Code:
+
+(require 'xcb)
+(require 'xcb-render)
+
+;; Protocol version.
+(defconst xcb:renderutil:-MAJOR_VERSION 0)
+(defconst xcb:renderutil:-MINOR_VERSION 11)
+
+;; PICTFORMINFO masks.
+(defconst xcb:renderutil:PICT_FORMAT:ID 1)
+(defconst xcb:renderutil:PICT_FORMAT:TYPE 2)
+(defconst xcb:renderutil:PICT_FORMAT:DEPTH 4)
+(defconst xcb:renderutil:PICT_FORMAT:RED 8)
+(defconst xcb:renderutil:PICT_FORMAT:RED_MASK 16)
+(defconst xcb:renderutil:PICT_FORMAT:GREEN 32)
+(defconst xcb:renderutil:PICT_FORMAT:GREEN_MASK 64)
+(defconst xcb:renderutil:PICT_FORMAT:BLUE 128)
+(defconst xcb:renderutil:PICT_FORMAT:BLUE_MASK 256)
+(defconst xcb:renderutil:PICT_FORMAT:ALPHA 512)
+(defconst xcb:renderutil:PICT_FORMAT:ALPHA_MASK 1024)
+(defconst xcb:renderutil:PICT_FORMAT:COLORMAP 2048)
+
+;; Indices of standard PictFormats.
+(defconst xcb:renderutil:PICT_STANDARD:ARGB_32 0)
+(defconst xcb:renderutil:PICT_STANDARD:RGB_24 1)
+(defconst xcb:renderutil:PICT_STANDARD:A_8 2)
+(defconst xcb:renderutil:PICT_STANDARD:A_4 3)
+(defconst xcb:renderutil:PICT_STANDARD:A_1 4)
+
+(defconst xcb:renderutil:STANDARD-TEMPLATES
+ (list
+ ;; xcb:renderutil:PICT_STANDARD:ARGB_32
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 32
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 16
+ :red-mask #xFF
+ :green-shift 8
+ :green-mask #xFF
+ :blue-shift 0
+ :blue-mask #xFF
+ :alpha-shift 24
+ :alpha-mask #xFF)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK))
+ ;; xcb:renderutil:PICT_STANDARD:RGB_24
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 24
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 16
+ :red-mask #xFF
+ :green-shift 8
+ :green-mask #xFF
+ :blue-shift 0
+ :blue-mask #xFF
+ :alpha-shift 0
+ :alpha-mask #x00)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK))
+ ;; xcb:renderutil:PICT_STANDARD:A_8
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 8
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 0
+ :red-mask #x00
+ :green-shift 0
+ :green-mask #x00
+ :blue-shift 0
+ :blue-mask #x00
+ :alpha-shift 0
+ :alpha-mask #xFF)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK))
+ ;; xcb:renderutil:PICT_STANDARD:A_4
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 4
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 0
+ :red-mask #x00
+ :green-shift 0
+ :green-mask #x00
+ :blue-shift 0
+ :blue-mask #x00
+ :alpha-shift 0
+ :alpha-mask #x0F)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK))
+ ;; xcb:renderutil:PICT_STANDARD:A_1
+ (vector (make-instance 'xcb:render:PICTFORMINFO
+ :id 0
+ :type xcb:render:PictType:Direct
+ :depth 1
+ :direct (make-instance 'xcb:render:DIRECTFORMAT
+ :red-shift 0
+ :red-mask #x00
+ :green-shift 0
+ :green-mask #x00
+ :blue-shift 0
+ :blue-mask #x00
+ :alpha-shift 0
+ :alpha-mask #x01)
+ :colormap 0)
+ (logior xcb:renderutil:PICT_FORMAT:TYPE
+ xcb:renderutil:PICT_FORMAT:DEPTH
+ xcb:renderutil:PICT_FORMAT:RED_MASK
+ xcb:renderutil:PICT_FORMAT:GREEN_MASK
+ xcb:renderutil:PICT_FORMAT:BLUE_MASK
+ xcb:renderutil:PICT_FORMAT:ALPHA
+ xcb:renderutil:PICT_FORMAT:ALPHA_MASK)))
+ "Standard PictFormats.")
+
+(cl-defmethod xcb:renderutil:-get-cache ((obj xcb:connection))
+ "Return the cache and initialize the extension when first called."
+ (let ((result (plist-get (slot-value obj 'extra-plist) 'renderutil))
+ required-depths)
+ (unless (or result
+ (= 0 (slot-value
+ (xcb:get-extension-data obj 'xcb:render)
+ 'present)))
+ (setq result
+ (vector (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:render:QueryVersion
+ :client-major-version
+ xcb:renderutil:-MAJOR_VERSION
+ :client-minor-version
+ xcb:renderutil:-MINOR_VERSION))
+ (xcb:+request-unchecked+reply obj
+ (make-instance 'xcb:render:QueryPictFormats))))
+ (setq required-depths '(1 4 8 24 32))
+ (catch 'break
+ (dolist (s (slot-value (aref result 1) 'screens))
+ (dolist (d (slot-value s 'depths))
+ (setq required-depths
+ (delq (slot-value d 'depth) required-depths))
+ (unless required-depths
+ (throw 'break nil)))))
+ (if required-depths
+ (setq result nil)
+ (setf (slot-value obj 'extra-plist)
+ (plist-put (slot-value obj 'extra-plist) 'renderutil result))))
+ result))
+
+(defun xcb:renderutil:find-visual-format (formats visual)
+ "Search FORMATS for a format matching visual VISUAL."
+ (catch 'return
+ (dolist (s (slot-value formats 'screens))
+ (dolist (d (slot-value s 'depths))
+ (dolist (v (slot-value d 'visuals))
+ (when (= (slot-value v 'visual) visual)
+ (throw 'return (slot-value v 'format))))))))
+
+(defun xcb:renderutil:find-format (formats mask template count)
+ "Search FORMATS for a format matching mask MASK and template TEMPLATE.
+
+Return COUNT-th match."
+ (catch 'return
+ (unless formats
+ (throw 'return nil))
+ (dolist (f (slot-value formats 'formats))
+ (when (and (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:ID))
+ (eq (slot-value template 'id) (slot-value f 'id))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:TYPE))
+ (eq (slot-value template 'type) (slot-value f 'type))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:DEPTH))
+ (eq (slot-value template 'depth) (slot-value f 'depth))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:RED))
+ (eq (slot-value (slot-value template 'direct) 'red-shift)
+ (slot-value (slot-value f 'direct) 'red-shift))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:RED_MASK))
+ (eq (slot-value (slot-value template 'direct) 'red-mask)
+ (slot-value (slot-value f 'direct) 'red-mask))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:GREEN))
+ (eq (slot-value (slot-value template 'direct) 'red-shift)
+ (slot-value (slot-value f 'direct) 'red-shift))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:GREEN_MASK))
+ (eq (slot-value (slot-value template 'direct) 'red-mask)
+ (slot-value (slot-value f 'direct) 'red-mask))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:BLUE))
+ (eq (slot-value (slot-value template 'direct) 'red-shift)
+ (slot-value (slot-value f 'direct) 'red-shift))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:BLUE_MASK))
+ (eq (slot-value (slot-value template 'direct) 'red-mask)
+ (slot-value (slot-value f 'direct) 'red-mask))
+ t)
+ (if (/= 0 (logand mask xcb:renderutil:PICT_FORMAT:COLORMAP))
+ (eq (slot-value template 'colormap)
+ (slot-value f 'colormap))
+ t))
+ (when (= count 0)
+ (throw 'return (slot-value f 'id))
+ (cl-decf count))))))
+
+(defun xcb:renderutil:find-standard (formats format)
+ "Search FORMATS for a standard format matching format ID FORMAT."
+ (when (and (<= 0 format (1- (length xcb:renderutil:STANDARD-TEMPLATES))))
+ (let ((standard-format (elt xcb:renderutil:STANDARD-TEMPLATES format)))
+ (xcb:renderutil:find-format formats
+ (aref standard-format 1)
+ (aref standard-format 0)
+ 0))))
+
+(cl-defmethod xcb:renderutil:query-version ((obj xcb:connection))
+ "Return the version of Render extension."
+ (let ((cache (xcb:renderutil:-get-cache obj)))
+ (when cache
+ (aref cache 0))))
+
+(cl-defmethod xcb:renderutil:query-formats ((obj xcb:connection))
+ "Return supported formats of this X server."
+ (let ((cache (xcb:renderutil:-get-cache obj)))
+ (when cache
+ (aref cache 1))))
+
+
+
+(provide 'xcb-renderutil)
+
+;;; xcb-renderutil.el ends here
diff --git a/elpa/xelb-0.20/xcb-renderutil.elc b/elpa/xelb-0.20/xcb-renderutil.elc
new file mode 100644
index 0000000..b54a7be
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-renderutil.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-res.el b/elpa/xelb-0.20/xcb-res.el
new file mode 100644
index 0000000..509f62c
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-res.el
@@ -0,0 +1,195 @@
+;;; xcb-res.el --- X11 Res extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'res.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:res:-extension-xname "X-Resource")
+(defconst xcb:res:-extension-name "Res")
+(defconst xcb:res:-major-version 1)
+(defconst xcb:res:-minor-version 2)
+
+(require 'xcb-xproto)
+
+(defclass xcb:res:Client
+ (xcb:-struct)
+ ((resource-base :initarg :resource-base :type xcb:CARD32)
+ (resource-mask :initarg :resource-mask :type xcb:CARD32)))
+
+(defclass xcb:res:Type
+ (xcb:-struct)
+ ((resource-type :initarg :resource-type :type xcb:ATOM)
+ (count :initarg :count :type xcb:CARD32)))
+
+(defconst xcb:res:ClientIdMask:ClientXID 1)
+(defconst xcb:res:ClientIdMask:LocalClientPID 2)
+
+(defclass xcb:res:ClientIdSpec
+ (xcb:-struct)
+ ((client :initarg :client :type xcb:CARD32)
+ (mask :initarg :mask :type xcb:CARD32)))
+
+(defclass xcb:res:ClientIdValue
+ (xcb:-struct)
+ ((spec :initarg :spec :type xcb:res:ClientIdSpec)
+ (length :initarg :length :type xcb:CARD32)
+ (value~ :initform
+ '(name value type xcb:CARD32 size
+ (/
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (value :initarg :value :type xcb:-ignore)))
+
+(defclass xcb:res:ResourceIdSpec
+ (xcb:-struct)
+ ((resource :initarg :resource :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD32)))
+
+(defclass xcb:res:ResourceSizeSpec
+ (xcb:-struct)
+ ((spec :initarg :spec :type xcb:res:ResourceIdSpec)
+ (bytes :initarg :bytes :type xcb:CARD32)
+ (ref-count :initarg :ref-count :type xcb:CARD32)
+ (use-count :initarg :use-count :type xcb:CARD32)))
+
+(defclass xcb:res:ResourceSizeValue
+ (xcb:-struct)
+ ((size :initarg :size :type xcb:res:ResourceSizeSpec)
+ (num-cross-references :initarg :num-cross-references :type xcb:CARD32)
+ (cross-references~ :initform
+ '(name cross-references type xcb:res:ResourceSizeSpec size
+ (xcb:-fieldref 'num-cross-references))
+ :type xcb:-list)
+ (cross-references :initarg :cross-references :type xcb:-ignore)))
+
+(defclass xcb:res:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major :initarg :client-major :type xcb:CARD8)
+ (client-minor :initarg :client-minor :type xcb:CARD8)))
+(defclass xcb:res:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (server-major :initarg :server-major :type xcb:CARD16)
+ (server-minor :initarg :server-minor :type xcb:CARD16)))
+
+(defclass xcb:res:QueryClients
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)))
+(defclass xcb:res:QueryClients~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-clients :initarg :num-clients :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (clients~ :initform
+ '(name clients type xcb:res:Client size
+ (xcb:-fieldref 'num-clients))
+ :type xcb:-list)
+ (clients :initarg :clients :type xcb:-ignore)))
+
+(defclass xcb:res:QueryClientResources
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (xid :initarg :xid :type xcb:CARD32)))
+(defclass xcb:res:QueryClientResources~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-types :initarg :num-types :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (types~ :initform
+ '(name types type xcb:res:Type size
+ (xcb:-fieldref 'num-types))
+ :type xcb:-list)
+ (types :initarg :types :type xcb:-ignore)))
+
+(defclass xcb:res:QueryClientPixmapBytes
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (xid :initarg :xid :type xcb:CARD32)))
+(defclass xcb:res:QueryClientPixmapBytes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (bytes :initarg :bytes :type xcb:CARD32)
+ (bytes-overflow :initarg :bytes-overflow :type xcb:CARD32)))
+
+(defclass xcb:res:QueryClientIds
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (num-specs :initarg :num-specs :type xcb:CARD32)
+ (specs~ :initform
+ '(name specs type xcb:res:ClientIdSpec size
+ (xcb:-fieldref 'num-specs))
+ :type xcb:-list)
+ (specs :initarg :specs :type xcb:-ignore)))
+(defclass xcb:res:QueryClientIds~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-ids :initarg :num-ids :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (ids~ :initform
+ '(name ids type xcb:res:ClientIdValue size
+ (xcb:-fieldref 'num-ids))
+ :type xcb:-list)
+ (ids :initarg :ids :type xcb:-ignore)))
+
+(defclass xcb:res:QueryResourceBytes
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (client :initarg :client :type xcb:CARD32)
+ (num-specs :initarg :num-specs :type xcb:CARD32)
+ (specs~ :initform
+ '(name specs type xcb:res:ResourceIdSpec size
+ (xcb:-fieldref 'num-specs))
+ :type xcb:-list)
+ (specs :initarg :specs :type xcb:-ignore)))
+(defclass xcb:res:QueryResourceBytes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-sizes :initarg :num-sizes :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (sizes~ :initform
+ '(name sizes type xcb:res:ResourceSizeValue size
+ (xcb:-fieldref 'num-sizes))
+ :type xcb:-list)
+ (sizes :initarg :sizes :type xcb:-ignore)))
+
+
+
+(provide 'xcb-res)
+
+;;; xcb-res.el ends here
diff --git a/elpa/xelb-0.20/xcb-res.elc b/elpa/xelb-0.20/xcb-res.elc
new file mode 100644
index 0000000..2845d63
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-res.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-screensaver.el b/elpa/xelb-0.20/xcb-screensaver.el
new file mode 100644
index 0000000..478f747
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-screensaver.el
@@ -0,0 +1,164 @@
+;;; xcb-screensaver.el --- X11 ScreenSaver extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'screensaver.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:screensaver:-extension-xname "MIT-SCREEN-SAVER")
+(defconst xcb:screensaver:-extension-name "ScreenSaver")
+(defconst xcb:screensaver:-major-version 1)
+(defconst xcb:screensaver:-minor-version 1)
+
+(require 'xcb-xproto)
+
+(defconst xcb:screensaver:Kind:Blanked 0)
+(defconst xcb:screensaver:Kind:Internal 1)
+(defconst xcb:screensaver:Kind:External 2)
+
+(defconst xcb:screensaver:Event:NotifyMask 1)
+(defconst xcb:screensaver:Event:CycleMask 2)
+
+(defconst xcb:screensaver:State:Off 0)
+(defconst xcb:screensaver:State:On 1)
+(defconst xcb:screensaver:State:Cycle 2)
+(defconst xcb:screensaver:State:Disabled 3)
+
+(defclass xcb:screensaver:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD8)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:screensaver:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (server-major-version :initarg :server-major-version :type xcb:CARD16)
+ (server-minor-version :initarg :server-minor-version :type xcb:CARD16)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:screensaver:QueryInfo
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+(defclass xcb:screensaver:QueryInfo~reply
+ (xcb:-reply)
+ ((state :initarg :state :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (saver-window :initarg :saver-window :type xcb:WINDOW)
+ (ms-until-server :initarg :ms-until-server :type xcb:CARD32)
+ (ms-since-user-input :initarg :ms-since-user-input :type xcb:CARD32)
+ (event-mask :initarg :event-mask :type xcb:CARD32)
+ (kind :initarg :kind :type xcb:BYTE)
+ (pad~0 :initform 7 :type xcb:-pad)))
+
+(defclass xcb:screensaver:SelectInput
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (event-mask :initarg :event-mask :type xcb:CARD32)))
+
+(defclass xcb:screensaver:SetAttributes
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (border-width :initarg :border-width :type xcb:CARD16)
+ (class :initarg :class :type xcb:BYTE)
+ (depth :initarg :depth :type xcb:CARD8)
+ (visual :initarg :visual :type xcb:VISUALID)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 background-pixmap)
+ (2 background-pixel)
+ (4 border-pixmap)
+ (8 border-pixel)
+ (16 bit-gravity)
+ (32 win-gravity)
+ (64 backing-store)
+ (128 backing-planes)
+ (256 backing-pixel)
+ (512 override-redirect)
+ (1024 save-under)
+ (2048 event-mask)
+ (4096 do-not-propogate-mask)
+ (8192 colormap)
+ (16384 cursor)))
+ :type xcb:-switch)
+ (background-pixmap :initarg :background-pixmap :type xcb:PIXMAP)
+ (background-pixel :initarg :background-pixel :type xcb:CARD32)
+ (border-pixmap :initarg :border-pixmap :type xcb:PIXMAP)
+ (border-pixel :initarg :border-pixel :type xcb:CARD32)
+ (bit-gravity :initarg :bit-gravity :type xcb:CARD32)
+ (win-gravity :initarg :win-gravity :type xcb:CARD32)
+ (backing-store :initarg :backing-store :type xcb:CARD32)
+ (backing-planes :initarg :backing-planes :type xcb:CARD32)
+ (backing-pixel :initarg :backing-pixel :type xcb:CARD32)
+ (override-redirect :initarg :override-redirect :type xcb:BOOL32)
+ (save-under :initarg :save-under :type xcb:BOOL32)
+ (event-mask :initarg :event-mask :type xcb:CARD32)
+ (do-not-propogate-mask :initarg :do-not-propogate-mask :type xcb:CARD32)
+ (colormap :initarg :colormap :type xcb:COLORMAP)
+ (cursor :initarg :cursor :type xcb:CURSOR)))
+
+(defclass xcb:screensaver:UnsetAttributes
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+
+(defclass xcb:screensaver:Suspend
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (suspend :initarg :suspend :type xcb:CARD32)))
+
+(defclass xcb:screensaver:Notify
+ (xcb:-event)
+ ((~code :initform 0)
+ (state :initarg :state :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (root :initarg :root :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (kind :initarg :kind :type xcb:BYTE)
+ (forced :initarg :forced :type xcb:BOOL)
+ (pad~0 :initform 14 :type xcb:-pad)))
+
+(defconst xcb:screensaver:event-number-class-alist
+ '((0 . xcb:screensaver:Notify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-screensaver)
+
+;;; xcb-screensaver.el ends here
diff --git a/elpa/xelb-0.20/xcb-screensaver.elc b/elpa/xelb-0.20/xcb-screensaver.elc
new file mode 100644
index 0000000..62ee476
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-screensaver.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-shape.el b/elpa/xelb-0.20/xcb-shape.el
new file mode 100644
index 0000000..17b4a19
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-shape.el
@@ -0,0 +1,187 @@
+;;; xcb-shape.el --- X11 Shape extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'shape.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:shape:-extension-xname "SHAPE")
+(defconst xcb:shape:-extension-name "Shape")
+(defconst xcb:shape:-major-version 1)
+(defconst xcb:shape:-minor-version 1)
+
+(require 'xcb-xproto)
+
+(xcb:deftypealias 'xcb:shape:OP 'xcb:CARD8)
+
+(xcb:deftypealias 'xcb:shape:KIND 'xcb:CARD8)
+
+(defconst xcb:shape:SO:Set 0)
+(defconst xcb:shape:SO:Union 1)
+(defconst xcb:shape:SO:Intersect 2)
+(defconst xcb:shape:SO:Subtract 3)
+(defconst xcb:shape:SO:Invert 4)
+
+(defconst xcb:shape:SK:Bounding 0)
+(defconst xcb:shape:SK:Clip 1)
+(defconst xcb:shape:SK:Input 2)
+
+(defclass xcb:shape:Notify
+ (xcb:-event)
+ ((~code :initform 0)
+ (shape-kind :initarg :shape-kind :type xcb:shape:KIND)
+ (~sequence :type xcb:CARD16)
+ (affected-window :initarg :affected-window :type xcb:WINDOW)
+ (extents-x :initarg :extents-x :type xcb:INT16)
+ (extents-y :initarg :extents-y :type xcb:INT16)
+ (extents-width :initarg :extents-width :type xcb:CARD16)
+ (extents-height :initarg :extents-height :type xcb:CARD16)
+ (server-time :initarg :server-time :type xcb:TIMESTAMP)
+ (shaped :initarg :shaped :type xcb:BOOL)
+ (pad~0 :initform 11 :type xcb:-pad)))
+
+(defclass xcb:shape:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)))
+(defclass xcb:shape:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)))
+
+(defclass xcb:shape:Rectangles
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (operation :initarg :operation :type xcb:shape:OP)
+ (destination-kind :initarg :destination-kind :type xcb:shape:KIND)
+ (ordering :initarg :ordering :type xcb:BYTE)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (destination-window :initarg :destination-window :type xcb:WINDOW)
+ (x-offset :initarg :x-offset :type xcb:INT16)
+ (y-offset :initarg :y-offset :type xcb:INT16)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size nil)
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defclass xcb:shape:Mask
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (operation :initarg :operation :type xcb:shape:OP)
+ (destination-kind :initarg :destination-kind :type xcb:shape:KIND)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (destination-window :initarg :destination-window :type xcb:WINDOW)
+ (x-offset :initarg :x-offset :type xcb:INT16)
+ (y-offset :initarg :y-offset :type xcb:INT16)
+ (source-bitmap :initarg :source-bitmap :type xcb:PIXMAP)))
+
+(defclass xcb:shape:Combine
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (operation :initarg :operation :type xcb:shape:OP)
+ (destination-kind :initarg :destination-kind :type xcb:shape:KIND)
+ (source-kind :initarg :source-kind :type xcb:shape:KIND)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (destination-window :initarg :destination-window :type xcb:WINDOW)
+ (x-offset :initarg :x-offset :type xcb:INT16)
+ (y-offset :initarg :y-offset :type xcb:INT16)
+ (source-window :initarg :source-window :type xcb:WINDOW)))
+
+(defclass xcb:shape:Offset
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (destination-kind :initarg :destination-kind :type xcb:shape:KIND)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (destination-window :initarg :destination-window :type xcb:WINDOW)
+ (x-offset :initarg :x-offset :type xcb:INT16)
+ (y-offset :initarg :y-offset :type xcb:INT16)))
+
+(defclass xcb:shape:QueryExtents
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (destination-window :initarg :destination-window :type xcb:WINDOW)))
+(defclass xcb:shape:QueryExtents~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (bounding-shaped :initarg :bounding-shaped :type xcb:BOOL)
+ (clip-shaped :initarg :clip-shaped :type xcb:BOOL)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (bounding-shape-extents-x :initarg :bounding-shape-extents-x :type xcb:INT16)
+ (bounding-shape-extents-y :initarg :bounding-shape-extents-y :type xcb:INT16)
+ (bounding-shape-extents-width :initarg :bounding-shape-extents-width :type xcb:CARD16)
+ (bounding-shape-extents-height :initarg :bounding-shape-extents-height :type xcb:CARD16)
+ (clip-shape-extents-x :initarg :clip-shape-extents-x :type xcb:INT16)
+ (clip-shape-extents-y :initarg :clip-shape-extents-y :type xcb:INT16)
+ (clip-shape-extents-width :initarg :clip-shape-extents-width :type xcb:CARD16)
+ (clip-shape-extents-height :initarg :clip-shape-extents-height :type xcb:CARD16)))
+
+(defclass xcb:shape:SelectInput
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (destination-window :initarg :destination-window :type xcb:WINDOW)
+ (enable :initarg :enable :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:shape:InputSelected
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (destination-window :initarg :destination-window :type xcb:WINDOW)))
+(defclass xcb:shape:InputSelected~reply
+ (xcb:-reply)
+ ((enabled :initarg :enabled :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:shape:GetRectangles
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (source-kind :initarg :source-kind :type xcb:shape:KIND)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:shape:GetRectangles~reply
+ (xcb:-reply)
+ ((ordering :initarg :ordering :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (rectangles-len :initarg :rectangles-len :type xcb:CARD32)
+ (pad~0 :initform 20 :type xcb:-pad)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size
+ (xcb:-fieldref 'rectangles-len))
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defconst xcb:shape:event-number-class-alist
+ '((0 . xcb:shape:Notify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-shape)
+
+;;; xcb-shape.el ends here
diff --git a/elpa/xelb-0.20/xcb-shape.elc b/elpa/xelb-0.20/xcb-shape.elc
new file mode 100644
index 0000000..9beb44f
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-shape.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-shm.el b/elpa/xelb-0.20/xcb-shm.el
new file mode 100644
index 0000000..5b04e4e
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-shm.el
@@ -0,0 +1,170 @@
+;;; xcb-shm.el --- X11 Shm extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'shm.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:shm:-extension-xname "MIT-SHM")
+(defconst xcb:shm:-extension-name "Shm")
+(defconst xcb:shm:-major-version 1)
+(defconst xcb:shm:-minor-version 2)
+
+(require 'xcb-xproto)
+
+(xcb:deftypealias 'xcb:shm:SEG 'xcb:-u4)
+
+(defclass xcb:shm:Completion
+ (xcb:-event)
+ ((~code :initform 0)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (minor-event :initarg :minor-event :type xcb:CARD16)
+ (major-event :initarg :major-event :type xcb:BYTE)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)
+ (offset :initarg :offset :type xcb:CARD32)))
+
+(defclass xcb:shm:BadSeg
+ (xcb:-error xcb:Value)
+ ((~code :initform 0)))
+
+(defclass xcb:shm:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)))
+(defclass xcb:shm:QueryVersion~reply
+ (xcb:-reply)
+ ((shared-pixmaps :initarg :shared-pixmaps :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)
+ (uid :initarg :uid :type xcb:CARD16)
+ (gid :initarg :gid :type xcb:CARD16)
+ (pixmap-format :initarg :pixmap-format :type xcb:CARD8)
+ (pad~0 :initform 15 :type xcb:-pad)))
+
+(defclass xcb:shm:Attach
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)
+ (shmid :initarg :shmid :type xcb:CARD32)
+ (read-only :initarg :read-only :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:shm:Detach
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)))
+
+(defclass xcb:shm:PutImage
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (total-width :initarg :total-width :type xcb:CARD16)
+ (total-height :initarg :total-height :type xcb:CARD16)
+ (src-x :initarg :src-x :type xcb:CARD16)
+ (src-y :initarg :src-y :type xcb:CARD16)
+ (src-width :initarg :src-width :type xcb:CARD16)
+ (src-height :initarg :src-height :type xcb:CARD16)
+ (dst-x :initarg :dst-x :type xcb:INT16)
+ (dst-y :initarg :dst-y :type xcb:INT16)
+ (depth :initarg :depth :type xcb:CARD8)
+ (format :initarg :format :type xcb:CARD8)
+ (send-event :initarg :send-event :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)
+ (offset :initarg :offset :type xcb:CARD32)))
+
+(defclass xcb:shm:GetImage
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (plane-mask :initarg :plane-mask :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)
+ (offset :initarg :offset :type xcb:CARD32)))
+(defclass xcb:shm:GetImage~reply
+ (xcb:-reply)
+ ((depth :initarg :depth :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (visual :initarg :visual :type xcb:VISUALID)
+ (size :initarg :size :type xcb:CARD32)))
+
+(defclass xcb:shm:CreatePixmap
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (pid :initarg :pid :type xcb:PIXMAP)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (depth :initarg :depth :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)
+ (offset :initarg :offset :type xcb:CARD32)))
+
+(defclass xcb:shm:AttachFd
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)
+ (shm-fd :type xcb:fd)
+ (read-only :initarg :read-only :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:shm:CreateSegment
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)
+ (size :initarg :size :type xcb:CARD32)
+ (read-only :initarg :read-only :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:shm:CreateSegment~reply
+ (xcb:-reply)
+ ((nfd :initarg :nfd :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (shm-fd :type xcb:fd)
+ (pad~0 :initform 24 :type xcb:-pad)))
+
+(defconst xcb:shm:error-number-class-alist
+ '((0 . xcb:shm:BadSeg))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:shm:event-number-class-alist
+ '((0 . xcb:shm:Completion))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-shm)
+
+;;; xcb-shm.el ends here
diff --git a/elpa/xelb-0.20/xcb-shm.elc b/elpa/xelb-0.20/xcb-shm.elc
new file mode 100644
index 0000000..40f570d
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-shm.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-sync.el b/elpa/xelb-0.20/xcb-sync.el
new file mode 100644
index 0000000..698ee59
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-sync.el
@@ -0,0 +1,340 @@
+;;; xcb-sync.el --- X11 Sync extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'sync.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:sync:-extension-xname "SYNC")
+(defconst xcb:sync:-extension-name "Sync")
+(defconst xcb:sync:-major-version 3)
+(defconst xcb:sync:-minor-version 1)
+
+(require 'xcb-xproto)
+
+(xcb:deftypealias 'xcb:sync:ALARM 'xcb:-u4)
+
+(defconst xcb:sync:ALARMSTATE:Active 0)
+(defconst xcb:sync:ALARMSTATE:Inactive 1)
+(defconst xcb:sync:ALARMSTATE:Destroyed 2)
+
+(xcb:deftypealias 'xcb:sync:COUNTER 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:sync:FENCE 'xcb:-u4)
+
+(defconst xcb:sync:TESTTYPE:PositiveTransition 0)
+(defconst xcb:sync:TESTTYPE:NegativeTransition 1)
+(defconst xcb:sync:TESTTYPE:PositiveComparison 2)
+(defconst xcb:sync:TESTTYPE:NegativeComparison 3)
+
+(defconst xcb:sync:VALUETYPE:Absolute 0)
+(defconst xcb:sync:VALUETYPE:Relative 1)
+
+(defconst xcb:sync:CA:Counter 1)
+(defconst xcb:sync:CA:ValueType 2)
+(defconst xcb:sync:CA:Value 4)
+(defconst xcb:sync:CA:TestType 8)
+(defconst xcb:sync:CA:Delta 16)
+(defconst xcb:sync:CA:Events 32)
+
+(defclass xcb:sync:INT64
+ (xcb:-struct)
+ ((hi :initarg :hi :type xcb:INT32)
+ (lo :initarg :lo :type xcb:CARD32)))
+
+(defclass xcb:sync:SYSTEMCOUNTER
+ (xcb:-struct)
+ ((counter :initarg :counter :type xcb:sync:COUNTER)
+ (resolution :initarg :resolution :type xcb:sync:INT64)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:sync:TRIGGER
+ (xcb:-struct)
+ ((counter :initarg :counter :type xcb:sync:COUNTER)
+ (wait-type :initarg :wait-type :type xcb:CARD32)
+ (wait-value :initarg :wait-value :type xcb:sync:INT64)
+ (test-type :initarg :test-type :type xcb:CARD32)))
+
+(defclass xcb:sync:WAITCONDITION
+ (xcb:-struct)
+ ((trigger :initarg :trigger :type xcb:sync:TRIGGER)
+ (event-threshold :initarg :event-threshold :type xcb:sync:INT64)))
+
+(defclass xcb:sync:Counter
+ (xcb:-error)
+ ((~code :initform 0)
+ (bad-counter :initarg :bad-counter :type xcb:CARD32)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD16)
+ (major-opcode :initarg :major-opcode :type xcb:CARD8)))
+
+(defclass xcb:sync:Alarm
+ (xcb:-error)
+ ((~code :initform 1)
+ (bad-alarm :initarg :bad-alarm :type xcb:CARD32)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD16)
+ (major-opcode :initarg :major-opcode :type xcb:CARD8)))
+
+(defclass xcb:sync:Initialize
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (desired-major-version :initarg :desired-major-version :type xcb:CARD8)
+ (desired-minor-version :initarg :desired-minor-version :type xcb:CARD8)))
+(defclass xcb:sync:Initialize~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD8)
+ (minor-version :initarg :minor-version :type xcb:CARD8)
+ (pad~1 :initform 22 :type xcb:-pad)))
+
+(defclass xcb:sync:ListSystemCounters
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)))
+(defclass xcb:sync:ListSystemCounters~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (counters-len :initarg :counters-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (counters~ :initform
+ '(name counters type xcb:sync:SYSTEMCOUNTER size
+ (xcb:-fieldref 'counters-len))
+ :type xcb:-list)
+ (counters :initarg :counters :type xcb:-ignore)))
+
+(defclass xcb:sync:CreateCounter
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (id :initarg :id :type xcb:sync:COUNTER)
+ (initial-value :initarg :initial-value :type xcb:sync:INT64)))
+
+(defclass xcb:sync:DestroyCounter
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (counter :initarg :counter :type xcb:sync:COUNTER)))
+
+(defclass xcb:sync:QueryCounter
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (counter :initarg :counter :type xcb:sync:COUNTER)))
+(defclass xcb:sync:QueryCounter~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (counter-value :initarg :counter-value :type xcb:sync:INT64)))
+
+(defclass xcb:sync:Await
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (wait-list~ :initform
+ '(name wait-list type xcb:sync:WAITCONDITION size nil)
+ :type xcb:-list)
+ (wait-list :initarg :wait-list :type xcb:-ignore)))
+
+(defclass xcb:sync:ChangeCounter
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (counter :initarg :counter :type xcb:sync:COUNTER)
+ (amount :initarg :amount :type xcb:sync:INT64)))
+
+(defclass xcb:sync:SetCounter
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (counter :initarg :counter :type xcb:sync:COUNTER)
+ (value :initarg :value :type xcb:sync:INT64)))
+
+(defclass xcb:sync:CreateAlarm
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (id :initarg :id :type xcb:sync:ALARM)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 counter)
+ (2 valueType)
+ (4 value)
+ (8 testType)
+ (16 delta)
+ (32 events)))
+ :type xcb:-switch)
+ (counter :initarg :counter :type xcb:sync:COUNTER)
+ (valueType :initarg :valueType :type xcb:CARD32)
+ (value :initarg :value :type xcb:sync:INT64)
+ (testType :initarg :testType :type xcb:CARD32)
+ (delta :initarg :delta :type xcb:sync:INT64)
+ (events :initarg :events :type xcb:CARD32)))
+
+(defclass xcb:sync:ChangeAlarm
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (id :initarg :id :type xcb:sync:ALARM)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 counter)
+ (2 valueType)
+ (4 value)
+ (8 testType)
+ (16 delta)
+ (32 events)))
+ :type xcb:-switch)
+ (counter :initarg :counter :type xcb:sync:COUNTER)
+ (valueType :initarg :valueType :type xcb:CARD32)
+ (value :initarg :value :type xcb:sync:INT64)
+ (testType :initarg :testType :type xcb:CARD32)
+ (delta :initarg :delta :type xcb:sync:INT64)
+ (events :initarg :events :type xcb:CARD32)))
+
+(defclass xcb:sync:DestroyAlarm
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (alarm :initarg :alarm :type xcb:sync:ALARM)))
+
+(defclass xcb:sync:QueryAlarm
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (alarm :initarg :alarm :type xcb:sync:ALARM)))
+(defclass xcb:sync:QueryAlarm~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (trigger :initarg :trigger :type xcb:sync:TRIGGER)
+ (delta :initarg :delta :type xcb:sync:INT64)
+ (events :initarg :events :type xcb:BOOL)
+ (state :initarg :state :type xcb:CARD8)
+ (pad~1 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:sync:SetPriority
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (id :initarg :id :type xcb:CARD32)
+ (priority :initarg :priority :type xcb:INT32)))
+
+(defclass xcb:sync:GetPriority
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (id :initarg :id :type xcb:CARD32)))
+(defclass xcb:sync:GetPriority~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (priority :initarg :priority :type xcb:INT32)))
+
+(defclass xcb:sync:CreateFence
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (fence :initarg :fence :type xcb:sync:FENCE)
+ (initially-triggered :initarg :initially-triggered :type xcb:BOOL)))
+
+(defclass xcb:sync:TriggerFence
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (fence :initarg :fence :type xcb:sync:FENCE)))
+
+(defclass xcb:sync:ResetFence
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (fence :initarg :fence :type xcb:sync:FENCE)))
+
+(defclass xcb:sync:DestroyFence
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (fence :initarg :fence :type xcb:sync:FENCE)))
+
+(defclass xcb:sync:QueryFence
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (fence :initarg :fence :type xcb:sync:FENCE)))
+(defclass xcb:sync:QueryFence~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (triggered :initarg :triggered :type xcb:BOOL)
+ (pad~1 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:sync:AwaitFence
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (fence-list~ :initform
+ '(name fence-list type xcb:sync:FENCE size nil)
+ :type xcb:-list)
+ (fence-list :initarg :fence-list :type xcb:-ignore)))
+
+(defclass xcb:sync:CounterNotify
+ (xcb:-event)
+ ((~code :initform 0)
+ (kind :initarg :kind :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (counter :initarg :counter :type xcb:sync:COUNTER)
+ (wait-value :initarg :wait-value :type xcb:sync:INT64)
+ (counter-value :initarg :counter-value :type xcb:sync:INT64)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (count :initarg :count :type xcb:CARD16)
+ (destroyed :initarg :destroyed :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:sync:AlarmNotify
+ (xcb:-event)
+ ((~code :initform 1)
+ (kind :initarg :kind :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (alarm :initarg :alarm :type xcb:sync:ALARM)
+ (counter-value :initarg :counter-value :type xcb:sync:INT64)
+ (alarm-value :initarg :alarm-value :type xcb:sync:INT64)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (state :initarg :state :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defconst xcb:sync:error-number-class-alist
+ '((0 . xcb:sync:Counter)
+ (1 . xcb:sync:Alarm))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:sync:event-number-class-alist
+ '((0 . xcb:sync:CounterNotify)
+ (1 . xcb:sync:AlarmNotify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-sync)
+
+;;; xcb-sync.el ends here
diff --git a/elpa/xelb-0.20/xcb-sync.elc b/elpa/xelb-0.20/xcb-sync.elc
new file mode 100644
index 0000000..0859729
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-sync.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-systemtray.el b/elpa/xelb-0.20/xcb-systemtray.el
new file mode 100644
index 0000000..03d47df
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-systemtray.el
@@ -0,0 +1,142 @@
+;;; xcb-systemtray.el --- System tray protocol -*- lexical-binding: t -*-
+
+;; Copyright (C) 2016-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library implements the system tray protocol.
+
+;; Usage tips:
+;; + Do not forget to call `xcb:systemtray:init' for _every_ connection using
+;; this library.
+;; + Use `xcb:systemtray:SendEvent' instead of `xcb:SendEvent' to send opcode
+;; messages defined in this library.
+;; + Initializing this library auto loads and initializes 'xcb-ewmh'.
+
+;; References:
+;; + System Tray Protocol (https://specifications.freedesktop.org/
+;; systemtray-spec/systemtray-spec-0.3.html)
+
+;;; Code:
+
+(require 'xcb-ewmh)
+
+;; System tray atoms.
+(eval-and-compile
+ (defconst xcb:systemtray:-atoms ;_NET_SYSTEM_TRAY_Sn are left out.
+ '(_NET_SYSTEM_TRAY_OPCODE
+ _NET_SYSTEM_TRAY_ORIENTATION
+ _NET_SYSTEM_TRAY_VISUAL
+ _NET_SYSTEM_TRAY_MESSAGE_DATA)
+ "Atoms involved in the system tray protocol.")
+
+ (dolist (atom xcb:systemtray:-atoms)
+ (eval `(defvar ,(intern (concat "xcb:Atom:" (symbol-name atom))) nil))))
+
+;; Opcodes.
+(defconst xcb:systemtray:opcode:REQUEST-DOCK 0)
+(defconst xcb:systemtray:opcode:BEGIN-MESSAGE 1)
+(defconst xcb:systemtray:opcode:CANCEL-MESSAGE 2)
+
+(cl-defmethod xcb:systemtray:init ((obj xcb:connection) &optional force)
+ "Initialize the system tray module.
+
+This method must be called before using any other method in this module."
+ (when (or force (not xcb:Atom:_NET_SYSTEM_TRAY_OPCODE))
+ (xcb:ewmh:init obj) ;required.
+ (let ((atoms xcb:systemtray:-atoms))
+ (dotimes (i (x-display-screens))
+ (push (intern (format "_NET_SYSTEM_TRAY_S%d" i)) atoms))
+ (xcb:icccm:intern-atoms obj atoms force))))
+
+(defclass xcb:systemtray:SendEvent (xcb:SendEvent)
+ ((propagate :initform 0)
+ (event-mask :initform 'xcb:EventMask:NoEvent))
+ :documentation "Send system tray opcode message.")
+
+(defclass xcb:systemtray:-ClientMessage
+ (xcb:icccm:--ClientMessage xcb:ClientMessage)
+ ((format :initform 32)
+ (type :initform 'xcb:Atom:_NET_SYSTEM_TRAY_OPCODE)
+ (time :initarg :time :type xcb:TIMESTAMP) ;new slot
+ (opcode :initarg :opcode :type xcb:CARD32)) ;new slot
+ :documentation "An system tray opcode message.")
+
+(defclass xcb:systemtray:REQUEST-DOCK (xcb:systemtray:-ClientMessage)
+ ((opcode :initform 'xcb:systemtray:opcode:REQUEST-DOCK)
+ (id :initarg :id :type xcb:CARD32)
+ (pad~0 :initform 8 :type xcb:-pad))
+ :documentation "Dock a tray icon.")
+
+(defclass xcb:systemtray:BEGIN-MESSAGE (xcb:systemtray:-ClientMessage)
+ ((opcode :initform 'xcb:systemtray:opcode:BEGIN-MESSAGE)
+ (timeout :initarg :timeout :type xcb:TIMESTAMP)
+ (length :initarg :length :type xcb:CARD32)
+ (id :initarg :id :type xcb:CARD32))
+ :documentation "Begin balloon message.")
+
+(defclass xcb:systemtray:MESSAGE-DATA
+ (xcb:icccm:--ClientMessage xcb:ClientMessage)
+ ((format :initform 8)
+ (type :initform 'xcb:Atom:_NET_SYSTEM_TRAY_MESSAGE_DATA)
+ (data~ :initform '(name data type xcb:CARD8 size 20) :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:systemtray:CANCEL-MESSAGE (xcb:systemtray:-ClientMessage)
+ ((opcode :initform 'xcb:systemtray:opcode:CANCEL-MESSAGE)
+ (id :initarg :id :type xcb:CARD32)
+ (pad~0 :initform 8 :type xcb:-pad))
+ :documentation "Cancel balloon message.")
+
+;; Value of _NET_SYSTEM_TRAY_ORIENTATION.
+(defconst xcb:systemtray:ORIENTATION:HORZ 0)
+(defconst xcb:systemtray:ORIENTATION:VERT 1)
+
+(defclass xcb:xembed:get-_NET_SYSTEM_TRAY_ORIENTATION
+ (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_SYSTEM_TRAY_ORIENTATION)
+ (type :initform 'xcb:Atom:CARDINAL)))
+(defclass xcb:xembed:get-_NET_SYSTEM_TRAY_ORIENTATION~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:xembed:set-_NET_SYSTEM_TRAY_ORIENTATION
+ (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_SYSTEM_TRAY_ORIENTATION)
+ (type :initform 'xcb:Atom:CARDINAL)
+ (format :initform 32)))
+
+(defclass xcb:xembed:get-_NET_SYSTEM_TRAY_VISUAL
+ (xcb:icccm:-GetProperty-single)
+ ((property :initform 'xcb:Atom:_NET_SYSTEM_TRAY_VISUAL)
+ (type :initform 'xcb:Atom:VISUALID)))
+(defclass xcb:xembed:get-_NET_SYSTEM_TRAY_VISUAL~reply
+ (xcb:icccm:-GetProperty-single~reply)
+ nil)
+(defclass xcb:xembed:set-_NET_SYSTEM_TRAY_VISUAL
+ (xcb:icccm:-ChangeProperty-single)
+ ((property :initform 'xcb:Atom:_NET_SYSTEM_TRAY_VISUAL)
+ (type :initform 'xcb:Atom:VISUALID)
+ (format :initform 32)))
+
+
+
+(provide 'xcb-systemtray)
+
+;;; xcb-systemtray.el ends here
diff --git a/elpa/xelb-0.20/xcb-systemtray.elc b/elpa/xelb-0.20/xcb-systemtray.elc
new file mode 100644
index 0000000..a2d7cdf
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-systemtray.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-types.el b/elpa/xelb-0.20/xcb-types.el
new file mode 100644
index 0000000..5a078aa
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-types.el
@@ -0,0 +1,912 @@
+;;; xcb-types.el --- Type definitions for XCB -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library defines various data types frequently used in XELB. Simple
+;; types are defined with `cl-deftype' while others are defined as classes.
+;; Basically, data types are used for converting objects to/from byte arrays
+;; rather than for validation purpose. Classes defined elsewhere should also
+;; support `xcb:marshal' and `xcb:unmarshal' methods in order to be considered
+;; a type. Most classes defined here are direct or indirect subclasses of
+;; `xcb:-struct', which has implemented the fundamental marshalling and
+;; unmarshalling methods. These classes again act as the superclasses for more
+;; concrete ones. You may use `eieio-browse' to easily get an overview of the
+;; inheritance hierarchies of all classes defined.
+
+;; Please pay special attention to the byte order adopted in your application.
+;; The global variable `xcb:lsb' specifies the byte order at the time of
+;; instantiating a class (e.g. via `make-instance'). You may let-bind it to
+;; temporarily change the byte order locally.
+
+;; Todo:
+;; + The current implementation of `eieio-default-eval-maybe' only `eval's a
+;; certain type of forms. If this is changed in the future, we will have to
+;; adapt our codes accordingly.
+;; + <paramref> for `xcb:-marshal-field'?
+
+;; References:
+;; + X protocol (http://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.txt)
+
+;;; Code:
+
+(require 'compat)
+(require 'cl-lib) ; cl-coerce
+(require 'cl-generic)
+(require 'eieio)
+(require 'xcb-debug)
+
+(define-minor-mode xcb:debug
+ "Debug-logging enabled if non-nil."
+ :group 'debug
+ :global t)
+
+(defmacro xcb:-log (&optional format-string &rest objects)
+ "Emit a message prepending the name of the function being executed.
+
+FORMAT-STRING is a string specifying the message to output, as in
+`format'. The OBJECTS arguments specify the substitutions."
+ (unless format-string (setq format-string ""))
+ `(when xcb:debug
+ (xcb-debug:message ,(concat "%s%s:\t" format-string "\n")
+ (if xcb-debug:log-time-function
+ (funcall xcb-debug:log-time-function)
+ "")
+ (xcb-debug:compile-time-function-name)
+ ,@objects)
+ nil))
+
+;;;; Utility functions
+
+(defsubst xcb:-pack-u1 (value)
+ "1 byte unsigned integer => byte array."
+ (vector value))
+
+(defsubst xcb:-pack-i1 (value)
+ "1 byte signed integer => byte array."
+ (xcb:-pack-u1 (if (>= value 0) value
+ (1+ (logand #xFF (lognot (- value)))))))
+
+(defsubst xcb:-pack-u2 (value)
+ "2 bytes unsigned integer => byte array (MSB first)."
+ (vector (logand (ash value -8) #xFF) (logand value #xFF)))
+
+(defsubst xcb:-pack-u2-lsb (value)
+ "2 bytes unsigned integer => byte array (LSB first)."
+ (vector (logand value #xFF) (logand (ash value -8) #xFF)))
+
+(defsubst xcb:-pack-i2 (value)
+ "2 bytes signed integer => byte array (MSB first)."
+ (xcb:-pack-u2 (if (>= value 0) value
+ (1+ (logand #xFFFF (lognot (- value)))))))
+
+(defsubst xcb:-pack-i2-lsb (value)
+ "2 bytes signed integer => byte array (LSB first)."
+ (xcb:-pack-u2-lsb (if (>= value 0) value
+ (1+ (logand #xFFFF (lognot (- value)))))))
+
+;; Due to loss of significance of floating-point numbers, `xcb:-pack-u8' and
+;; `xcb:-pack-u8-lsb' may return approximate results.
+(eval-and-compile
+ (if (/= 0 (ash 1 32))
+ ;; 64 bit
+ (progn
+ (defsubst xcb:-pack-u4 (value)
+ "4 bytes unsigned integer => byte array (MSB first, 64-bit)."
+ (vector (logand (ash value -24) #xFF) (logand (ash value -16) #xFF)
+ (logand (ash value -8) #xFF) (logand value #xFF)))
+ (defsubst xcb:-pack-u4-lsb (value)
+ "4 byte unsigned integer => byte array (LSB first, 64-bit)."
+ (vector (logand value #xFF)
+ (logand (ash value -8) #xFF)
+ (logand (ash value -16) #xFF)
+ (logand (ash value -24) #xFF)))
+ (defsubst xcb:-pack-u8 (value)
+ "8 bytes unsigned integer => byte array (MSB first)."
+ (if (integerp value)
+ (vector (logand (ash value -56) #xFF)
+ (logand (ash value -48) #xFF)
+ (logand (ash value -40) #xFF)
+ (logand (ash value -32) #xFF)
+ (logand (ash value -24) #xFF)
+ (logand (ash value -16) #xFF)
+ (logand (ash value -8) #xFF)
+ (logand value #xFF))
+ (let* ((msdw (min 4294967295. (truncate value 4294967296.)))
+ (lsdw (min 4294967295.
+ (truncate (- value (* msdw 4294967296.0))))))
+ (vector (logand (ash msdw -24) #xFF) (logand (ash msdw -16) #xFF)
+ (logand (ash msdw -8) #xFF) (logand msdw #xFF)
+ (logand (ash lsdw -24) #xFF) (logand (ash lsdw -16) #xFF)
+ (logand (ash lsdw -8) #xFF) (logand lsdw #xFF)))))
+ (defsubst xcb:-pack-u8-lsb (value)
+ "8 bytes unsigned integer => byte array (LSB first)."
+ (if (integerp value)
+ (vector (logand value #xFF)
+ (logand (ash value -8) #xFF)
+ (logand (ash value -16) #xFF)
+ (logand (ash value -24) #xFF)
+ (logand (ash value -32) #xFF)
+ (logand (ash value -40) #xFF)
+ (logand (ash value -48) #xFF)
+ (logand (ash value -56) #xFF))
+ (let* ((msdw (min 4294967295. (truncate value 4294967296.)))
+ (lsdw (min 4294967295.
+ (truncate (- value (* msdw 4294967296.0))))))
+ (vector (logand lsdw #xFF) (logand (ash lsdw -8) #xFF)
+ (logand (ash lsdw -16) #xFF) (logand (ash lsdw -24) #xFF)
+ (logand msdw #xFF)
+ (logand (ash msdw -8) #xFF)
+ (logand (ash msdw -16) #xFF)
+ (logand (ash msdw -24) #xFF))))))
+ ;; 32 bit (30-bit actually; large numbers are represented as float type)
+ (defsubst xcb:-pack-u4 (value)
+ "4 bytes unsigned integer => byte array (MSB first, 32-bit)."
+ (if (integerp value)
+ (vector (logand (ash value -24) #xFF) (logand (ash value -16) #xFF)
+ (logand (ash value -8) #xFF) (logand value #xFF))
+ (let* ((msw (truncate value #x10000))
+ (lsw (truncate (- value (* msw 65536.0)))))
+ (vector (logand (ash msw -8) #xFF) (logand msw #xFF)
+ (logand (ash lsw -8) #xFF) (logand lsw #xFF)))))
+ (defsubst xcb:-pack-u4-lsb (value)
+ "4 bytes unsigned integer => byte array (LSB first, 32-bit)."
+ (if (integerp value)
+ (vector (logand value #xFF) (logand (ash value -8) #xFF)
+ (logand (ash value -16) #xFF) (logand (ash value -24) #xFF))
+ (let* ((msw (truncate value #x10000))
+ (lsw (truncate (- value (* msw 65536.0)))))
+ (vector (logand lsw #xFF) (logand (ash lsw -8) #xFF)
+ (logand msw #xFF) (logand (ash msw -8) #xFF)))))
+ (defsubst xcb:-pack-u8 (value)
+ "8 bytes unsigned integer => byte array (MSB first, 32-bit)."
+ (if (integerp value)
+ (vector 0 0 0 0
+ (logand (ash value -24) #xFF) (logand (ash value -16) #xFF)
+ (logand (ash value -8) #xFF) (logand value #xFF))
+ (let* ((msw (min #xFFFF (truncate value 281474976710656.)))
+ (w1 (min #xFFFF
+ (truncate (setq value
+ (- value (* msw 281474976710656.0)))
+ 4294967296.)))
+ (w2 (min #xFFFF
+ (truncate (setq value (- value (* w1 4294967296.0)))
+ #x10000)))
+ (lsw (min #xFFFF (truncate (- value (* w2 65536.0))))))
+ (vector (logand (ash msw -8) #xFF) (logand msw #xFF)
+ (logand (ash w1 -8) #xFF) (logand w1 #xFF)
+ (logand (ash w2 -8) #xFF) (logand w2 #xFF)
+ (logand (ash lsw -8) #xFF) (logand lsw #xFF)))))
+ (defsubst xcb:-pack-u8-lsb (value)
+ "8 bytes unsigned integer => byte array (LSB first, 32-bit)."
+ (if (integerp value)
+ (vector (logand value #xFF) (logand (ash value -8) #xFF)
+ (logand (ash value -16) #xFF) (logand (ash value -24) #xFF)
+ 0 0 0 0)
+ (let* ((msw (min #xFFFF (truncate value 281474976710656.)))
+ (w1 (min #xFFFF
+ (truncate (setq value
+ (- value (* msw 281474976710656.0)))
+ 4294967296.)))
+ (w2 (min #xFFFF
+ (truncate (setq value (- value (* w1 4294967296.0)))
+ #x10000)))
+ (lsw (min #xFFFF (truncate (- value (* w2 65536.0))))))
+ (vector (logand lsw #xFF) (logand (ash lsw -8) #xFF)
+ (logand w2 #xFF) (logand (ash w2 -8) #xFF)
+ (logand w1 #xFF) (logand (ash w1 -8) #xFF)
+ (logand msw #xFF) (logand (ash msw -8) #xFF)))))))
+
+(defsubst xcb:-pack-i4 (value)
+ "4 bytes signed integer => byte array (MSB first)."
+ (xcb:-pack-u4 (if (>= value 0)
+ value
+ (+ value 4294967296.)))) ;treated as float for 32-bit
+
+(defsubst xcb:-pack-i4-lsb (value)
+ "4 bytes signed integer => byte array (LSB first)."
+ (xcb:-pack-u4-lsb (if (>= value 0)
+ value
+ (+ value 4294967296.)))) ;treated as float for 32-bit
+
+(defsubst xcb:-unpack-u1 (data offset)
+ "Byte array => 1 byte unsigned integer."
+ (aref data offset))
+
+(defsubst xcb:-unpack-i1 (data offset)
+ "Byte array => 1 byte signed integer."
+ (let ((value (xcb:-unpack-u1 data offset)))
+ (if (= 0 (logand #x80 value))
+ value
+ (- (logand #xFF (lognot (1- value)))))))
+
+(defsubst xcb:-unpack-u2 (data offset)
+ "Byte array => 2 bytes unsigned integer (MSB first)."
+ (logior (ash (aref data offset) 8) (aref data (1+ offset))))
+
+(defsubst xcb:-unpack-u2-lsb (data offset)
+ "Byte array => 2 bytes unsigned integer (LSB first)."
+ (logior (aref data offset) (ash (aref data (1+ offset)) 8)))
+
+(defsubst xcb:-unpack-i2 (data offset)
+ "Byte array => 2 bytes signed integer (MSB first)."
+ (let ((value (xcb:-unpack-u2 data offset)))
+ (if (= 0 (logand #x8000 value))
+ value
+ (- (logand #xFFFF (lognot (1- value)))))))
+
+(defsubst xcb:-unpack-i2-lsb (data offset)
+ "Byte array => 2 bytes signed integer (LSB first)."
+ (let ((value (xcb:-unpack-u2-lsb data offset)))
+ (if (= 0 (logand #x8000 value))
+ value
+ (- (logand #xFFFF (lognot (1- value)))))))
+
+;; Due to loss of significance of floating-point numbers, `xcb:-unpack-u8' and
+;; `xcb:-unpack-u8-lsb' may return approximate results.
+(eval-and-compile
+ (if (/= 0 (ash 1 32))
+ ;; 64-bit
+ (progn
+ (defsubst xcb:-unpack-u4 (data offset)
+ "Byte array => 4 bytes unsigned integer (MSB first, 64-bit)."
+ (logior (ash (aref data offset) 24) (ash (aref data (1+ offset)) 16)
+ (ash (aref data (+ offset 2)) 8) (aref data (+ offset 3))))
+ (defsubst xcb:-unpack-u4-lsb (data offset)
+ "Byte array => 4 bytes unsigned integer (LSB first, 64-bit)."
+ (logior (aref data offset) (ash (aref data (1+ offset)) 8)
+ (ash (aref data (+ offset 2)) 16)
+ (ash (aref data (+ offset 3)) 24)))
+ (defsubst xcb:-unpack-u8 (data offset)
+ "Byte array => 8 bytes unsigned integer (MSB first)."
+ (let ((msb (aref data offset)))
+ (+ (if (> msb 31) (* msb 72057594037927936.0) (ash msb 56))
+ (logior (ash (aref data (1+ offset)) 48)
+ (ash (aref data (+ offset 2)) 40)
+ (ash (aref data (+ offset 3)) 32)
+ (ash (aref data (+ offset 4)) 24)
+ (ash (aref data (+ offset 5)) 16)
+ (ash (aref data (+ offset 6)) 8)
+ (aref data (+ offset 7))))))
+ (defsubst xcb:-unpack-u8-lsb (data offset)
+ "Byte array => 8 bytes unsigned integer (LSB first)."
+ (let ((msb (aref data (+ offset 7))))
+ (+ (if (> msb 31) (* msb 72057594037927936.0) (ash msb 56))
+ (logior (ash (aref data (+ offset 6)) 48)
+ (ash (aref data (+ offset 5)) 40)
+ (ash (aref data (+ offset 4)) 32)
+ (ash (aref data (+ offset 3)) 24)
+ (ash (aref data (+ offset 2)) 16)
+ (ash (aref data (1+ offset)) 8)
+ (aref data offset))))))
+ ;; 32-bit (30-bit actually; large numbers are represented as float type)
+ (defsubst xcb:-unpack-u4 (data offset)
+ "Byte array => 4 bytes unsigned integer (MSB first, 32-bit)."
+ (let ((msb (aref data offset)))
+ (+ (if (> msb 31) (* msb 16777216.0) (ash msb 24))
+ (logior (ash (aref data (1+ offset)) 16)
+ (ash (aref data (+ offset 2)) 8)
+ (aref data (+ offset 3))))))
+ (defsubst xcb:-unpack-u4-lsb (data offset)
+ "Byte array => 4 bytes unsigned integer (LSB first, 32-bit)."
+ (let ((msb (aref data (+ offset 3))))
+ (+ (if (> msb 31) (* msb 16777216.0) (ash msb 24))
+ (logior (aref data offset)
+ (ash (aref data (1+ offset)) 8)
+ (ash (aref data (+ offset 2)) 16)))))
+ (defsubst xcb:-unpack-u8 (data offset)
+ "Byte array => 8 bytes unsigned integer (MSB first, 32-bit)."
+ (+ (* (aref data offset) 72057594037927936.0)
+ (* (aref data (1+ offset)) 281474976710656.0)
+ (* (aref data (+ offset 2)) 1099511627776.0)
+ (* (aref data (+ offset 3)) 4294967296.0)
+ (* (aref data (+ offset 4)) 16777216.0)
+ (logior (ash (aref data (+ offset 5)) 16)
+ (ash (aref data (+ offset 6)) 8)
+ (aref data (+ offset 7)))))
+ (defsubst xcb:-unpack-u8-lsb (data offset)
+ "Byte array => 8 bytes unsigned integer (LSB first, 32-bit)."
+ (+ (* (aref data (+ offset 7)) 72057594037927936.0)
+ (* (aref data (+ offset 6)) 281474976710656.0)
+ (* (aref data (+ offset 5)) 1099511627776.0)
+ (* (aref data (+ offset 4)) 4294967296.0)
+ (* (aref data (+ offset 3)) 16777216.0)
+ (logior (ash (aref data (+ offset 2)) 16)
+ (ash (aref data (1+ offset)) 8)
+ (aref data offset))))))
+
+(defsubst xcb:-unpack-i4 (data offset)
+ "Byte array => 4 bytes signed integer (MSB first)."
+ (let ((value (xcb:-unpack-u4 data offset)))
+ (if (< value 2147483648.) ;treated as float for 32-bit
+ value
+ (- value 4294967296.)))) ;treated as float for 32-bit
+
+(defsubst xcb:-unpack-i4-lsb (data offset)
+ "Byte array => 4 bytes signed integer (LSB first)."
+ (let ((value (xcb:-unpack-u4-lsb data offset)))
+ (if (< value 2147483648.) ;treated as float for 32-bit
+ value
+ (- value 4294967296.)))) ;treated as float for 32-bit
+
+(defsubst xcb:-f64-to-binary64 (value)
+ "Encode a 64-bit float VALUE as a binary64 (IEEE 754)."
+ (let* ((sigexp (frexp value))
+ (exp (+ (cdr sigexp) 1022))
+ (frac (abs (car sigexp)))
+ (isneg (< (copysign 1.0 (car sigexp)) 0)) ; use `copysign' to detect -0.0
+ (signmask (if isneg #x8000000000000000 0)))
+ (+ (cond ((zerop frac) 0) ; 0
+ ((isnan frac) #xff0000000000001) ; NaN
+ ((or (>= exp 2047) (= frac 1e+INF)) #x7ff0000000000000) ; Inf
+ ((<= exp 0) (ash (round (ldexp frac 52)) exp)) ; Subnormal
+ (t (+ (ash exp 52) (logand #xfffffffffffff
+ (round (ldexp frac 53)))))) ; Normal
+ signmask)))
+
+(defsubst xcb:-f32-to-binary32 (value)
+ "Encode a 32-bit float VALUE as a binary32 (IEEE 754)."
+ (let* ((sigexp (frexp value))
+ (exp (+ (cdr sigexp) 126))
+ (frac (abs (car sigexp)))
+ (isneg (< (copysign 1.0 (car sigexp)) 0)) ; use `copysign' to detect -0.0
+ (signmask (if isneg #x80000000 0)))
+ (+ (cond ((zerop frac) 0) ; 0
+ ((isnan frac) #x7f800001) ; NaN
+ ((or (>= exp 255) (= frac 1e+INF)) #x7f800000) ; Inf
+ ((<= exp 0) (ash (round (ldexp frac 23)) exp)) ; Subnormal
+ (t (+ (ash exp 23) (logand #x7fffff (round (ldexp frac 24)))))) ; Normal
+ signmask)))
+
+(defsubst xcb:-binary64-to-f64 (value)
+ "Decode binary64 VALUE into a float."
+ (let ((sign (pcase (ash value -63)
+ (0 +0.0)
+ (1 -0.0)
+ (_ (error "[XCB] Value too large for a float64: %d" value))))
+ (exp (logand 2047 (ash value -52)))
+ (frac (logand #xfffffffffffff value)))
+ (copysign ; Use copysign, not multiplication, to deal with +/- NAN.
+ (pcase exp
+ (2047 (if (zerop frac) 1e+INF 1e+NaN)) ; INF/NAN
+ (0 (ldexp frac -1074)) ; Subnormal
+ (_ (ldexp (+ #x10000000000000 frac) (- exp 1075)))) ; Normal
+ sign)))
+
+(defsubst xcb:-binary32-to-f32 (value)
+ "Decode binary32 VALUE into a float."
+ (let ((sign (pcase (ash value -31)
+ (0 +0.0)
+ (1 -0.0)
+ (_ (error "[XCB] Value too large for a float32: %d" value))))
+ (exp (logand 255 (ash value -23)))
+ (frac (logand #x7fffff value)))
+ (copysign ; Use copysign, not multiplication, to deal with +/- NAN.
+ (pcase exp
+ (255 (if (zerop frac) 1e+INF 1e+NaN)) ; INF/NAN
+ (0 (ldexp frac -149)) ; Subnormal
+ (_ (ldexp (+ #x800000 frac) (- exp 150)))) ; Normal
+ sign)))
+
+(defmacro xcb:-fieldref (field)
+ "Evaluate a <fieldref> field."
+ `(slot-value obj ,field))
+
+(defmacro xcb:-paramref (field)
+ "Evaluate a <paramref> field."
+ `(slot-value ctx ,field))
+
+(defsubst xcb:-request-class->reply-class (request)
+ "Return the reply class corresponding to the request class REQUEST."
+ (intern-soft (concat (symbol-name request) "~reply")))
+
+;;;; Basic types
+
+;; typedef in C
+(defmacro xcb:deftypealias (new-type old-type)
+ "Define NEW-TYPE as an alias of type OLD-TYPE.
+
+Also the fundamental type is stored in the `xcb--typealias'
+variable property (for internal use only)."
+ `(progn
+ ;; FIXME: `new-type' should probably just not be eval'd at all,
+ ;; but that requires changing all callers not to quote their arg.
+ (cl-deftype ,(eval new-type t) nil ,old-type)
+ (put ,new-type 'xcb--typealias
+ (or (get ,old-type 'xcb--typealias) ,old-type))))
+
+;; 1/2/4 B signed/unsigned integer
+(cl-deftype xcb:-i1 () t)
+(cl-deftype xcb:-i2 () t)
+(cl-deftype xcb:-i4 () t)
+(cl-deftype xcb:-u1 () t)
+(cl-deftype xcb:-u2 () t)
+(cl-deftype xcb:-u4 () t)
+;; 8 B unsigned integer
+(cl-deftype xcb:-u8 () t)
+;; floats & doubles
+(cl-deftype xcb:-f32 () t)
+(cl-deftype xcb:-f64 () t)
+;; <pad>
+(cl-deftype xcb:-pad () t)
+;; <pad> with align attribute
+(cl-deftype xcb:-pad-align () t)
+;; <fd>
+(xcb:deftypealias 'xcb:fd 'xcb:-i4)
+;; <list>
+(cl-deftype xcb:-list () t)
+;; <switch>
+(cl-deftype xcb:-switch () t)
+;; This type of data is not involved in marshalling/unmarshalling
+(cl-deftype xcb:-ignore () t)
+;; C types and types missing in XCB
+(cl-deftype xcb:void () t)
+(xcb:deftypealias 'xcb:char 'xcb:-u1)
+(xcb:deftypealias 'xcb:BYTE 'xcb:-u1)
+(xcb:deftypealias 'xcb:INT8 'xcb:-i1)
+(xcb:deftypealias 'xcb:INT16 'xcb:-i2)
+(xcb:deftypealias 'xcb:INT32 'xcb:-i4)
+(xcb:deftypealias 'xcb:CARD8 'xcb:-u1)
+(xcb:deftypealias 'xcb:CARD16 'xcb:-u2)
+(xcb:deftypealias 'xcb:CARD32 'xcb:-u4)
+(xcb:deftypealias 'xcb:CARD64 'xcb:-u8)
+(xcb:deftypealias 'xcb:BOOL 'xcb:-u1)
+(xcb:deftypealias 'xcb:float 'xcb:-f32)
+(xcb:deftypealias 'xcb:double 'xcb:-f64)
+
+;;;; Struct type
+
+(eval-and-compile
+ (defvar xcb:lsb t
+ "Non-nil for LSB first (i.e., little-endian), nil otherwise.
+
+Consider let-bind it rather than change its global value."))
+
+(defclass xcb:--struct ()
+ nil)
+
+(cl-defmethod slot-unbound ((object xcb:--struct) class slot-name fn)
+ (unless (eq fn #'oref-default)
+ (xcb:-log "unbound-slot: %s" (list (eieio-class-name class)
+ (eieio-object-name object)
+ slot-name fn))))
+
+(defclass xcb:-struct (xcb:--struct)
+ ((~lsb :initarg :~lsb
+ :initform (symbol-value 'xcb:lsb) ;see `eieio-default-eval-maybe'
+ :type xcb:-ignore)
+ (~size :initform nil :type xcb:-ignore))
+ :documentation "Struct type.")
+
+(cl-defmethod xcb:marshal ((obj xcb:-struct))
+ "Return the byte-array representation of struct OBJ."
+ (let ((slots (eieio-class-slots (eieio-object-class obj)))
+ result name type value)
+ (catch 'break
+ (dolist (slot slots)
+ (setq type (cl--slot-descriptor-type slot))
+ (unless (eq type 'xcb:-ignore)
+ (setq name (eieio-slot-descriptor-name slot))
+ (setq value (slot-value obj name))
+ (when (symbolp value) ;see `eieio-default-eval-maybe'
+ (setq value (symbol-value value)))
+ (setq result
+ (vconcat result (xcb:-marshal-field obj type value
+ (length result))))
+ (when (eq type 'xcb:-switch) ;xcb:-switch always finishes a struct
+ (throw 'break 'nil)))))
+ ;; If we specify a size, verify that it matches the actual size.
+ (when-let* ((size-exp (slot-value obj '~size))
+ (size (eval size-exp `((obj . ,obj)))))
+ (unless (length= result size)
+ (error "[XCB] Unexpected size for type %s: got %d, expected %d"
+ (type-of obj)
+ (length result)
+ size)))
+ result))
+
+(cl-defmethod xcb:-marshal-field ((obj xcb:-struct) type value &optional pos)
+ "Return the byte-array representation of a field in struct OBJ of type TYPE
+and value VALUE.
+
+The optional POS argument indicates current byte index of the field (used by
+`xcb:-pad-align' type)."
+ (pcase (or (get type 'xcb--typealias) type)
+ (`xcb:-u1 (xcb:-pack-u1 value))
+ (`xcb:-i1 (xcb:-pack-i1 value))
+ (`xcb:-u2
+ (if (slot-value obj '~lsb) (xcb:-pack-u2-lsb value) (xcb:-pack-u2 value)))
+ (`xcb:-i2
+ (if (slot-value obj '~lsb) (xcb:-pack-i2-lsb value) (xcb:-pack-i2 value)))
+ (`xcb:-u4
+ (if (slot-value obj '~lsb) (xcb:-pack-u4-lsb value) (xcb:-pack-u4 value)))
+ (`xcb:-i4
+ (if (slot-value obj '~lsb) (xcb:-pack-i4-lsb value) (xcb:-pack-i4 value)))
+ (`xcb:-u8
+ (if (slot-value obj '~lsb) (xcb:-pack-u8-lsb value) (xcb:-pack-u8 value)))
+ (`xcb:-f32
+ (let ((value (xcb:-f32-to-binary32 value)))
+ (if (slot-value obj '~lsb) (xcb:-pack-u4-lsb value) (xcb:-pack-u4 value))))
+ (`xcb:-f64
+ (let ((value (xcb:-f64-to-binary64 value)))
+ (if (slot-value obj '~lsb) (xcb:-pack-u8-lsb value) (xcb:-pack-u8 value))))
+ (`xcb:void (vector value))
+ (`xcb:-pad
+ (unless (integerp value)
+ (setq value (eval value `((obj . ,obj)))))
+ (make-vector value 0))
+ (`xcb:-pad-align
+ ;; The length slot in xcb:-request is left out
+ (let ((len (if (object-of-class-p obj 'xcb:-request) (+ pos 2) pos)))
+ (when (vectorp value)
+ ;; Alignment with offset.
+ (setq len (- len (aref value 1))
+ value (aref value 0)))
+ (unless (integerp value)
+ (setq value (eval value `((obj . ,obj)))))
+ (make-vector (% (- value (% len value)) value) 0)))
+ (`xcb:-list
+ (let* ((list-name (plist-get value 'name))
+ (list-type (plist-get value 'type))
+ (list-size (plist-get value 'size))
+ (data (slot-value obj list-name)))
+ (unless (integerp list-size)
+ (setq list-size (eval list-size `((obj . ,obj))))
+ (unless list-size
+ (setq list-size (length data)))) ;list-size can be nil
+ (cl-assert (= list-size (length data)))
+ ;; The data may be large, and if it's a string that's supposed
+ ;; to be converted to a vector of bytes, then the transform can
+ ;; be done trivially and much faster by just coercing.
+ (if (and (eq list-type 'xcb:BYTE)
+ (eq (type-of data) 'string))
+ (cl-coerce data 'vector)
+ (mapconcat (lambda (i) (xcb:-marshal-field obj list-type i))
+ data []))))
+ (`xcb:-switch
+ (let ((slots (eieio-class-slots (eieio-object-class obj)))
+ (expression (plist-get value 'expression))
+ (cases (plist-get value 'cases))
+ result condition name-list flag slot-type)
+ (unless (integerp expression)
+ (setq expression (eval expression `((obj . ,obj)))))
+ (cl-assert (integerp expression))
+ (dolist (i cases)
+ (setq condition (car i))
+ (setq name-list (cdr i))
+ (setq flag nil)
+ (cl-assert (or (integerp condition) (listp condition)))
+ (if (integerp condition)
+ (setq flag (/= 0 (logand expression condition)))
+ (if (eq 'logior (car condition))
+ (setq flag (/= 0 (logand expression
+ (apply #'logior (cdr condition)))))
+ (setq flag (memq expression condition))))
+ (when flag
+ (dolist (name name-list)
+ (catch 'break
+ (dolist (slot slots) ;better way to find the slot type?
+ (when (eq name (eieio-slot-descriptor-name slot))
+ (setq slot-type (cl--slot-descriptor-type slot))
+ (throw 'break nil))))
+ (unless (eq slot-type 'xcb:-ignore)
+ (setq result
+ (vconcat result
+ (xcb:-marshal-field obj slot-type
+ (slot-value obj name)
+ (+ pos
+ (length result)))))))))
+ result))
+ ((guard (child-of-class-p type 'xcb:-struct))
+ (xcb:marshal value))
+ (x (error "[XCB] Unsupported type for marshalling: %s" x))))
+
+(cl-defmethod xcb:unmarshal ((obj xcb:-struct) byte-array &optional ctx
+ total-length)
+ "Fill in fields of struct OBJ according to its byte-array representation.
+
+The optional argument CTX is for <paramref>."
+ (unless total-length
+ (setq total-length (length byte-array)))
+ (let ((slots (eieio-class-slots (eieio-object-class obj)))
+ (result 0)
+ slot-name tmp type)
+ (catch 'break
+ (dolist (slot slots)
+ (setq type (cl--slot-descriptor-type slot))
+ (unless (eq type 'xcb:-ignore)
+ (setq slot-name (eieio-slot-descriptor-name slot)
+ tmp (xcb:-unmarshal-field obj type byte-array result
+ (eieio-oref-default obj slot-name)
+ ctx total-length))
+ (setf (slot-value obj slot-name) (car tmp))
+ (setq result (+ result (cadr tmp)))
+ (when (eq type 'xcb:-switch) ;xcb:-switch always finishes a struct
+ (throw 'break 'nil)))))
+ ;; Let the struct compute it's size if a length field is specified. This lets us skip unknown
+ ;; fields.
+ (when-let* ((size-exp (slot-value obj '~size))
+ (size (eval size-exp `((obj . ,obj)))))
+ ;; Make sure the stated size is reasonable.
+ (cond
+ ((< size result)
+ (error "[XCB] Object of type `%s' specified a size (%d) less than the number of bytes read (%d)"
+ (type-of obj) size result))
+ ((length< byte-array (- size result))
+ (error "[XCB] Object of type `%s' specified a size (%d) greater than the size of the input (%d)"
+ (type-of obj) size (+ result (length byte-array)))))
+ ;; Skip any additional bytes.
+ (setq result size))
+ result))
+
+(cl-defmethod xcb:-unmarshal-field ((obj xcb:-struct) type data offset
+ initform &optional ctx total-length)
+ "Return the value of a field in struct OBJ of type TYPE, byte-array
+representation DATA, and default value INITFORM.
+
+The optional argument CTX is for <paramref>.
+
+This method returns a list of two components, with the first being the result
+and the second the consumed length."
+ (pcase (or (get type 'xcb--typealias) type)
+ (`xcb:-u1 (list (aref data offset) 1))
+ (`xcb:-i1 (let ((result (aref data offset)))
+ (list (if (< result 128) result (- result 255)) 1)))
+ (`xcb:-u2 (list (if (slot-value obj '~lsb)
+ (xcb:-unpack-u2-lsb data offset)
+ (xcb:-unpack-u2 data offset))
+ 2))
+ (`xcb:-i2 (list (if (slot-value obj '~lsb)
+ (xcb:-unpack-i2-lsb data offset)
+ (xcb:-unpack-i2 data offset))
+ 2))
+ (`xcb:-u4 (list (if (slot-value obj '~lsb)
+ (xcb:-unpack-u4-lsb data offset)
+ (xcb:-unpack-u4 data offset))
+ 4))
+ (`xcb:-i4 (list (if (slot-value obj '~lsb)
+ (xcb:-unpack-i4-lsb data offset)
+ (xcb:-unpack-i4 data offset))
+ 4))
+ (`xcb:-u8 (list (if (slot-value obj '~lsb)
+ (xcb:-unpack-u8-lsb data offset)
+ (xcb:-unpack-u8 data offset))
+ 8))
+ (`xcb:-f32 (list (xcb:-binary32-to-f32
+ (if (slot-value obj '~lsb)
+ (xcb:-unpack-u4-lsb data offset)
+ (xcb:-unpack-u4 data offset)))
+ 4))
+ (`xcb:-f64 (list (xcb:-binary64-to-f64
+ (if (slot-value obj '~lsb)
+ (xcb:-unpack-u8-lsb data offset)
+ (xcb:-unpack-u8 data offset)))
+ 8))
+ (`xcb:void (list (aref data offset) 1))
+ (`xcb:-pad
+ (unless (integerp initform)
+ (when (eq 'quote (car initform))
+ (setq initform (cadr initform)))
+ (setq initform (eval initform `((obj . ,obj) (ctx . ,ctx)))))
+ (list initform initform))
+ (`xcb:-pad-align
+ (let ((len (- total-length (- (length data) offset))))
+ (if (vectorp initform)
+ ;; Alignment with offset.
+ (setq len (- len (aref initform 1))
+ initform (aref initform 0))
+ (unless (integerp initform)
+ (when (eq 'quote (car initform))
+ (setq initform (cadr initform)))
+ (setq initform (eval initform `((obj . ,obj) (ctx . ,ctx))))))
+ (list initform (% (- initform (% len initform)) initform))))
+ (`xcb:-list
+ (when (eq 'quote (car initform)) ;unquote the form
+ (setq initform (cadr initform)))
+ (let ((list-name (plist-get initform 'name))
+ (list-type (plist-get initform 'type))
+ (list-size (plist-get initform 'size)))
+ (unless (integerp list-size)
+ (setq list-size (eval list-size `((obj . ,obj) (ctx . ,ctx)))))
+ (cl-assert (integerp list-size))
+ (pcase list-type
+ (`xcb:char ;as Latin-1 encoded string
+ (setf (slot-value obj list-name)
+ (decode-coding-string
+ (apply #'unibyte-string
+ (append (substring data offset
+ (+ offset list-size))
+ nil))
+ 'iso-latin-1)))
+ (`xcb:void ;for further unmarshalling
+ (setf (slot-value obj list-name)
+ (substring data offset (+ offset list-size))))
+ (x
+ (let ((count 0)
+ result tmp)
+ (dotimes (_ list-size)
+ (setq tmp (xcb:-unmarshal-field obj x data (+ offset count) nil
+ nil total-length))
+ (setq result (nconc result (list (car tmp))))
+ (setq count (+ count (cadr tmp))))
+ (setf (slot-value obj list-name) result)
+ (setq list-size count)))) ;to byte length
+ (list initform list-size)))
+ (`xcb:-switch
+ (let ((slots (eieio-class-slots (eieio-object-class obj)))
+ (expression (plist-get initform 'expression))
+ (cases (plist-get initform 'cases))
+ (count 0)
+ condition name-list flag slot-type tmp)
+ (unless (integerp expression)
+ (setq expression (eval expression `((obj . ,obj) (ctx . ,ctx)))))
+ (cl-assert (integerp expression))
+ (dolist (i cases)
+ (setq condition (car i))
+ (setq name-list (cdr i))
+ (setq flag nil)
+ (cl-assert (or (integerp condition) (listp condition)))
+ (if (integerp condition)
+ (setq flag (/= 0 (logand expression condition)))
+ (if (eq 'logior (car condition))
+ (setq flag (/= 0 (logand expression
+ (apply #'logior (cdr condition)))))
+ (setq flag (memq expression condition))))
+ (when flag
+ (dolist (name name-list)
+ (catch 'break
+ (dolist (slot slots) ;better way to find the slot type?
+ (when (eq name (eieio-slot-descriptor-name slot))
+ (setq slot-type (cl--slot-descriptor-type slot))
+ (throw 'break nil))))
+ (unless (eq slot-type 'xcb:-ignore)
+ (setq tmp (xcb:-unmarshal-field obj slot-type data (+ offset count)
+ (eieio-oref-default obj name)
+ nil total-length))
+ (setf (slot-value obj name) (car tmp))
+ (setq count (+ count (cadr tmp)))))))
+ (list initform count)))
+ ((and x (guard (child-of-class-p x 'xcb:-struct)))
+ (let* ((struct-obj (make-instance x))
+ (tmp (xcb:unmarshal struct-obj (substring data offset) obj
+ total-length)))
+ (list struct-obj tmp)))
+ (x (error "[XCB] Unsupported type for unmarshalling: %s" x))))
+
+;;;; Types derived directly from `xcb:-struct'
+
+(defclass xcb:-request (xcb:-struct)
+ nil
+ :documentation "X request type.")
+
+(defclass xcb:-reply (xcb:-struct)
+ ((~reply :initform 1 :type xcb:-u1))
+ :documentation "X reply type.")
+
+(defclass xcb:-event (xcb:-struct)
+ ((~code :type xcb:-u1))
+ :documentation "Event type.")
+;; Implemented in 'xcb.el'
+(cl-defgeneric xcb:-error-or-event-class->number (obj class))
+;;
+(cl-defmethod xcb:marshal ((obj xcb:-event) connection &optional sequence)
+ "Return the byte-array representation of event OBJ.
+
+This method is mainly designed for `xcb:SendEvent', where it's used to
+generate synthetic events. The CONNECTION argument is used to retrieve
+the event number of extensions. If SEQUENCE is non-nil, it is used as
+the sequence number of the synthetic event (if the event uses sequence
+number); otherwise, 0 is assumed.
+
+This method auto-pads short results to 32 bytes."
+ (let ((event-number
+ (xcb:-error-or-event-class->number connection
+ (eieio-object-class obj)))
+ result)
+ (when (consp event-number)
+ (setq event-number (cdr event-number))
+ (if (= 1 (length event-number))
+ ;; XKB event.
+ (setf (slot-value obj 'xkbType) (aref event-number 0))
+ ;; Generic event.
+ (setf (slot-value obj 'extensions) (aref event-number 0)
+ (slot-value obj 'evtype) (aref event-number 1))))
+ (when (slot-exists-p obj '~sequence)
+ (setf (slot-value obj '~sequence) (or sequence 0)))
+ (setq result (cl-call-next-method obj))
+ (when (> 32 (length result))
+ (setq result (vconcat result (make-vector (- 32 (length result)) 0))))
+ result))
+
+(defclass xcb:-generic-event (xcb:-event)
+ ((~code :initform 35)
+ (~extension :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (~length :type xcb:CARD32)
+ (~evtype :type xcb:CARD16))
+ :documentation "Generic event type.")
+
+(defclass xcb:-error (xcb:-struct)
+ ((~error :initform 0 :type xcb:-u1)
+ (~code :type xcb:-u1)
+ (~sequence :type xcb:CARD16))
+ :documentation "X error type.")
+
+(defclass xcb:-union (xcb:-struct)
+ ((~size :initarg :~size :type xcb:-ignore)) ;Size of the largest member.
+ :documentation "Union type.")
+;;
+(cl-defmethod slot-unbound ((_object xcb:-union) _class _slot-name _fn)
+ nil)
+;;
+(cl-defmethod xcb:marshal ((obj xcb:-union))
+ "Return the byte-array representation of union OBJ.
+
+This result is converted from the first bounded slot."
+ (let ((slots (eieio-class-slots (eieio-object-class obj)))
+ (size (slot-value obj '~size))
+ result slot type name tmp)
+ (while (and (not result) slots (> size (length result)))
+ (setq slot (pop slots))
+ (setq type (cl--slot-descriptor-type slot)
+ name (eieio-slot-descriptor-name slot))
+ (unless (or (not (slot-value obj name))
+ (eq type 'xcb:-ignore)
+ ;; Dealing with `xcb:-list' type
+ (and (eq type 'xcb:-list)
+ (not (slot-value obj (plist-get (slot-value obj name)
+ 'name)))))
+ (setq tmp (xcb:-marshal-field obj (cl--slot-descriptor-type slot)
+ (slot-value obj name)))
+ (when (> (length tmp) (length result))
+ (setq result tmp))))
+ (cond
+ ((length< result size)
+ (setq result (vconcat result (make-vector (- size (length result)) 0))))
+ ((length> result size)
+ (error "[XCB] Marshaled enum `%s' is larger than its declared size (%d > %d)"
+ (type-of obj) (length result) size)))
+ result))
+;;
+(cl-defmethod xcb:unmarshal ((obj xcb:-union) byte-array &optional ctx
+ total-length)
+ "Fill in every field in union OBJ, according to BYTE-ARRAY.
+
+The optional argument CTX is for <paramref>."
+ (unless total-length
+ (setq total-length (length byte-array)))
+ (let ((slots (eieio-class-slots (eieio-object-class obj)))
+ slot-name tmp type)
+ (dolist (slot slots)
+ (setq type (cl--slot-descriptor-type slot))
+ (unless (eq type 'xcb:-ignore)
+ (setq slot-name (eieio-slot-descriptor-name slot)
+ tmp (xcb:-unmarshal-field obj type byte-array 0
+ (eieio-oref-default obj slot-name)
+ ctx total-length))
+ (setf (slot-value obj (eieio-slot-descriptor-name slot)) (car tmp))))
+ (slot-value obj '~size)))
+
+
+
+(provide 'xcb-types)
+
+;;; xcb-types.el ends here
diff --git a/elpa/xelb-0.20/xcb-types.elc b/elpa/xelb-0.20/xcb-types.elc
new file mode 100644
index 0000000..2d5cba8
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-types.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xc_misc.el b/elpa/xelb-0.20/xcb-xc_misc.el
new file mode 100644
index 0000000..af15d34
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xc_misc.el
@@ -0,0 +1,79 @@
+;;; xcb-xc_misc.el --- X11 XCMisc extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xc_misc.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xc_misc:-extension-xname "XC-MISC")
+(defconst xcb:xc_misc:-extension-name "XCMisc")
+(defconst xcb:xc_misc:-major-version 1)
+(defconst xcb:xc_misc:-minor-version 1)
+
+(defclass xcb:xc_misc:GetVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD16)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD16)))
+(defclass xcb:xc_misc:GetVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (server-major-version :initarg :server-major-version :type xcb:CARD16)
+ (server-minor-version :initarg :server-minor-version :type xcb:CARD16)))
+
+(defclass xcb:xc_misc:GetXIDRange
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)))
+(defclass xcb:xc_misc:GetXIDRange~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (start-id :initarg :start-id :type xcb:CARD32)
+ (count :initarg :count :type xcb:CARD32)))
+
+(defclass xcb:xc_misc:GetXIDList
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (count :initarg :count :type xcb:CARD32)))
+(defclass xcb:xc_misc:GetXIDList~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (ids-len :initarg :ids-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (ids~ :initform
+ '(name ids type xcb:CARD32 size
+ (xcb:-fieldref 'ids-len))
+ :type xcb:-list)
+ (ids :initarg :ids :type xcb:-ignore)))
+
+
+
+(provide 'xcb-xc_misc)
+
+;;; xcb-xc_misc.el ends here
diff --git a/elpa/xelb-0.20/xcb-xc_misc.elc b/elpa/xelb-0.20/xcb-xc_misc.elc
new file mode 100644
index 0000000..2847e98
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xc_misc.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xembed.el b/elpa/xelb-0.20/xcb-xembed.el
new file mode 100644
index 0000000..c5273e8
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xembed.el
@@ -0,0 +1,184 @@
+;;; xcb-xembed.el --- XEmbed protocol -*- lexical-binding: t -*-
+
+;; Copyright (C) 2016-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library implements the XEmbed protocol.
+
+;; Usage tips:
+;; + Do not forget to call `xcb:xembed:init' for _every_ connection using this
+;; library.
+;; + Use `xcb:xembed:SendEvent' instead of `xcb:SendEvent' to send XEmbed
+;; messages defined in this library.
+
+;; References:
+;; + Xembed protocol (https://specifications.freedesktop.org/
+;; xembed-spec/xembed-spec-0.5.html)
+
+;;; Code:
+
+(require 'xcb-icccm)
+
+;; XEmbed atoms
+(eval-and-compile
+ (defconst xcb:xembed:-atoms
+ '(_XEMBED_INFO _XEMBED)
+ "XEmbed atoms.")
+
+ (dolist (atom xcb:xembed:-atoms)
+ (eval `(defvar ,(intern (concat "xcb:Atom:" (symbol-name atom))) nil))))
+
+;; XEMBED message opcodes.
+(defconst xcb:xembed:opcode:EMBEDDED-NOTIFY 0)
+(defconst xcb:xembed:opcode:WINDOW-ACTIVATE 1)
+(defconst xcb:xembed:opcode:WINDOW-DEACTIVATE 2)
+(defconst xcb:xembed:opcode:REQUEST-FOCUS 3)
+(defconst xcb:xembed:opcode:FOCUS-IN 4)
+(defconst xcb:xembed:opcode:FOCUS-OUT 5)
+(defconst xcb:xembed:opcode:FOCUS-NEXT 6)
+(defconst xcb:xembed:opcode:FOCUS-PREV 7)
+(defconst xcb:xembed:opcode:MODALITY-ON 10)
+(defconst xcb:xembed:opcode:MODALITY-OFF 11)
+(defconst xcb:xembed:opcode:REGISTER-ACCELERATOR 12)
+(defconst xcb:xembed:opcode:UNREGISTER-ACCELERATOR 13)
+(defconst xcb:xembed:opcode:ACTIVATE-ACCELERATOR 14)
+
+(cl-defmethod xcb:xembed:init ((obj xcb:connection) &optional force)
+ "Initialize the XEmbed module.
+
+This method must be called before using any other method in this module."
+ (when (or force (not xcb:Atom:_XEMBED_INFO))
+ (xcb:icccm:intern-atoms obj xcb:xembed:-atoms force)))
+
+;; Flags for _XEMBED_INFO.
+(defconst xcb:xembed:MAPPED 1)
+
+(defclass xcb:xembed:get-_XEMBED_INFO (xcb:icccm:-GetProperty-explicit)
+ ((property :initform 'xcb:Atom:_XEMBED_INFO)
+ (type :initform 'xcb:Atom:_XEMBED_INFO)))
+(defclass xcb:xembed:get-_XEMBED_INFO~reply
+ (xcb:icccm:-GetProperty-explicit~reply)
+ ((version :type xcb:-ignore)
+ (flags :type xcb:-ignore)))
+(defclass xcb:xembed:set-_XEMBED_INFO (xcb:icccm:-ChangeProperty-explicit)
+ ((property :initform 'xcb:Atom:_XEMBED_INFO)
+ (type :initform 'xcb:Atom:_XEMBED_INFO)
+ (format :initform 32)
+ (version :initarg :version :type xcb:-ignore)
+ (flags :initarg :flags :type xcb:-ignore)))
+
+(defclass xcb:xembed:SendEvent (xcb:SendEvent)
+ ((propagate :initform 0)
+ (event-mask :initform 'xcb:EventMask:NoEvent))
+ :documentation "Send XEmbed message.")
+
+(defclass xcb:xembed:-ClientMessage
+ (xcb:icccm:--ClientMessage xcb:ClientMessage)
+ ((format :initform 32)
+ (type :initform 'xcb:Atom:_XEMBED)
+ (time :initarg :time :type xcb:TIMESTAMP) ;new slot
+ (opcode :initarg :opcode :type xcb:CARD32) ;new slot
+ (detail :initarg :detail :initform 0 :type xcb:CARD32)) ;new slot
+ :documentation "An XEmbed client message.")
+
+(defclass xcb:xembed:EMBEDDED-NOTIFY (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:EMBEDDED-NOTIFY)
+ (embedder :initarg :embedder :type xcb:WINDOW)
+ (version :initarg :version :type xcb:CARD32)))
+
+(defclass xcb:xembed:WINDOW-ACTIVATE (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:WINDOW-ACTIVATE)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+(defclass xcb:xembed:WINDOW-DEACTIVATE (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:WINDOW-DEACTIVATE)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+(defclass xcb:xembed:REQUEST-FOCUS (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:REQUEST-FOCUS)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+;; Details for xcb:xembed:FOCUS-IN.
+(defconst xcb:xembed:FOCUS:CURRENT 0)
+(defconst xcb:xembed:FOCUS:FIRST 1)
+(defconst xcb:xembed:FOCUS:LAST 2)
+
+;; Directions for focusing.
+(defconst xcb:xembed:DIRECTION:DEFAULT 0)
+(defconst xcb:xembed:DIRECTION:UP-DOWN 1)
+(defconst xcb:xembed:DIRECTION:LEFT-RIGHT 2)
+
+(defclass xcb:xembed:FOCUS-IN (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:FOCUS-IN)
+ (direction :initarg :direction :initform 0 :type xcb:CARD32)
+ (pad~0 :initform 4 :type xcb:-pad)))
+
+(defclass xcb:xembed:FOCUS-OUT (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:FOCUS-OUT)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+(defclass xcb:xembed:FOCUS-NEXT (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:FOCUS-NEXT)
+ (direction :initarg :direction :initform 0 :type xcb:CARD32)
+ (pad~0 :initform 4 :type xcb:-pad)))
+
+(defclass xcb:xembed:FOCUS-PREV (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:FOCUS-PREV)
+ (direction :initarg :direction :initform 0 :type xcb:CARD32)
+ (pad~0 :initform 4 :type xcb:-pad)))
+
+;; Modifiers field for xcb:xembed:REGISTER-ACCELERATOR.
+(defconst xcb:xembed:MODIFIER:SHIFT 1)
+(defconst xcb:xembed:MODIFIER:CONTROL 2)
+(defconst xcb:xembed:MODIFIER:ALT 4)
+(defconst xcb:xembed:MODIFIER:SUPER 8)
+(defconst xcb:xembed:MODIFIER:HYPER 16)
+
+(defclass xcb:xembed:REGISTER-ACCELERATOR (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:REGISTER-ACCELERATOR)
+ (keysym :initarg :keysym :type xcb:KEYSYM)
+ (modifier :initarg :modifier :type xcb:CARD32)))
+
+(defclass xcb:xembed:UNREGISTER-ACCELERATOR (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:UNREGISTER-ACCELERATOR)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+;; Flags for XEMBED-ACTIVATE-ACCELERATOR.
+(defconst xcb:xembed:ACCELERATOR:OVERLOADED 1)
+
+(defclass xcb:xembed:ACTIVATE-ACCELERATOR (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:ACTIVATE-ACCELERATOR)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~0 :initform 4 :type xcb:-pad)))
+
+(defclass xcb:xembed:MODALITY-ON (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:MODALITY-ON)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+(defclass xcb:xembed:MODALITY-OFF (xcb:xembed:-ClientMessage)
+ ((opcode :initform 'xcb:xembed:opcode:MODALITY-OFF)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+
+
+(provide 'xcb-xembed)
+
+;;; xcb-xembed.el ends here
diff --git a/elpa/xelb-0.20/xcb-xembed.elc b/elpa/xelb-0.20/xcb-xembed.elc
new file mode 100644
index 0000000..e7ad71a
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xembed.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xevie.el b/elpa/xelb-0.20/xcb-xevie.el
new file mode 100644
index 0000000..33dff7e
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xevie.el
@@ -0,0 +1,105 @@
+;;; xcb-xevie.el --- X11 Xevie extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xevie.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xevie:-extension-xname "XEVIE")
+(defconst xcb:xevie:-extension-name "Xevie")
+(defconst xcb:xevie:-major-version 1)
+(defconst xcb:xevie:-minor-version 0)
+
+(defclass xcb:xevie:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD16)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD16)))
+(defclass xcb:xevie:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (server-major-version :initarg :server-major-version :type xcb:CARD16)
+ (server-minor-version :initarg :server-minor-version :type xcb:CARD16)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:xevie:Start
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:xevie:Start~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)))
+
+(defclass xcb:xevie:End
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (cmap :initarg :cmap :type xcb:CARD32)))
+(defclass xcb:xevie:End~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)))
+
+(defconst xcb:xevie:Datatype:Unmodified 0)
+(defconst xcb:xevie:Datatype:Modified 1)
+
+(defclass xcb:xevie:Event
+ (xcb:-struct)
+ ((pad~0 :initform 32 :type xcb:-pad)))
+
+(defclass xcb:xevie:Send
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (event :initarg :event :type xcb:xevie:Event)
+ (data-type :initarg :data-type :type xcb:CARD32)
+ (pad~0 :initform 64 :type xcb:-pad)))
+(defclass xcb:xevie:Send~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)))
+
+(defclass xcb:xevie:SelectInput
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (event-mask :initarg :event-mask :type xcb:CARD32)))
+(defclass xcb:xevie:SelectInput~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)))
+
+
+
+(provide 'xcb-xevie)
+
+;;; xcb-xevie.el ends here
diff --git a/elpa/xelb-0.20/xcb-xevie.elc b/elpa/xelb-0.20/xcb-xevie.elc
new file mode 100644
index 0000000..6ebfc43
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xevie.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xf86dri.el b/elpa/xelb-0.20/xcb-xf86dri.el
new file mode 100644
index 0000000..c1e40c6
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xf86dri.el
@@ -0,0 +1,213 @@
+;;; xcb-xf86dri.el --- X11 XF86Dri extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xf86dri.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xf86dri:-extension-xname "XFree86-DRI")
+(defconst xcb:xf86dri:-extension-name "XF86Dri")
+(defconst xcb:xf86dri:-major-version 4)
+(defconst xcb:xf86dri:-minor-version 1)
+
+(defclass xcb:xf86dri:DrmClipRect
+ (xcb:-struct)
+ ((x1 :initarg :x1 :type xcb:INT16)
+ (y1 :initarg :y1 :type xcb:INT16)
+ (x2 :initarg :x2 :type xcb:INT16)
+ (x3 :initarg :x3 :type xcb:INT16)))
+
+(defclass xcb:xf86dri:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)))
+(defclass xcb:xf86dri:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (dri-major-version :initarg :dri-major-version :type xcb:CARD16)
+ (dri-minor-version :initarg :dri-minor-version :type xcb:CARD16)
+ (dri-minor-patch :initarg :dri-minor-patch :type xcb:CARD32)))
+
+(defclass xcb:xf86dri:QueryDirectRenderingCapable
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:xf86dri:QueryDirectRenderingCapable~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (is-capable :initarg :is-capable :type xcb:BOOL)))
+
+(defclass xcb:xf86dri:OpenConnection
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:xf86dri:OpenConnection~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (sarea-handle-low :initarg :sarea-handle-low :type xcb:CARD32)
+ (sarea-handle-high :initarg :sarea-handle-high :type xcb:CARD32)
+ (bus-id-len :initarg :bus-id-len :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (bus-id~ :initform
+ '(name bus-id type xcb:char size
+ (xcb:-fieldref 'bus-id-len))
+ :type xcb:-list)
+ (bus-id :initarg :bus-id :type xcb:-ignore)))
+
+(defclass xcb:xf86dri:CloseConnection
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+
+(defclass xcb:xf86dri:GetClientDriverName
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:xf86dri:GetClientDriverName~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (client-driver-major-version :initarg :client-driver-major-version :type xcb:CARD32)
+ (client-driver-minor-version :initarg :client-driver-minor-version :type xcb:CARD32)
+ (client-driver-patch-version :initarg :client-driver-patch-version :type xcb:CARD32)
+ (client-driver-name-len :initarg :client-driver-name-len :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (client-driver-name~ :initform
+ '(name client-driver-name type xcb:char size
+ (xcb:-fieldref 'client-driver-name-len))
+ :type xcb:-list)
+ (client-driver-name :initarg :client-driver-name :type xcb:-ignore)))
+
+(defclass xcb:xf86dri:CreateContext
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (visual :initarg :visual :type xcb:CARD32)
+ (context :initarg :context :type xcb:CARD32)))
+(defclass xcb:xf86dri:CreateContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (hw-context :initarg :hw-context :type xcb:CARD32)))
+
+(defclass xcb:xf86dri:DestroyContext
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (context :initarg :context :type xcb:CARD32)))
+
+(defclass xcb:xf86dri:CreateDrawable
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (drawable :initarg :drawable :type xcb:CARD32)))
+(defclass xcb:xf86dri:CreateDrawable~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (hw-drawable-handle :initarg :hw-drawable-handle :type xcb:CARD32)))
+
+(defclass xcb:xf86dri:DestroyDrawable
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (drawable :initarg :drawable :type xcb:CARD32)))
+
+(defclass xcb:xf86dri:GetDrawableInfo
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (drawable :initarg :drawable :type xcb:CARD32)))
+(defclass xcb:xf86dri:GetDrawableInfo~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (drawable-table-index :initarg :drawable-table-index :type xcb:CARD32)
+ (drawable-table-stamp :initarg :drawable-table-stamp :type xcb:CARD32)
+ (drawable-origin-X :initarg :drawable-origin-X :type xcb:INT16)
+ (drawable-origin-Y :initarg :drawable-origin-Y :type xcb:INT16)
+ (drawable-size-W :initarg :drawable-size-W :type xcb:INT16)
+ (drawable-size-H :initarg :drawable-size-H :type xcb:INT16)
+ (num-clip-rects :initarg :num-clip-rects :type xcb:CARD32)
+ (back-x :initarg :back-x :type xcb:INT16)
+ (back-y :initarg :back-y :type xcb:INT16)
+ (num-back-clip-rects :initarg :num-back-clip-rects :type xcb:CARD32)
+ (clip-rects~ :initform
+ '(name clip-rects type xcb:xf86dri:DrmClipRect size
+ (xcb:-fieldref 'num-clip-rects))
+ :type xcb:-list)
+ (clip-rects :initarg :clip-rects :type xcb:-ignore)
+ (back-clip-rects~ :initform
+ '(name back-clip-rects type xcb:xf86dri:DrmClipRect size
+ (xcb:-fieldref 'num-back-clip-rects))
+ :type xcb:-list)
+ (back-clip-rects :initarg :back-clip-rects :type xcb:-ignore)))
+
+(defclass xcb:xf86dri:GetDeviceInfo
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:xf86dri:GetDeviceInfo~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (framebuffer-handle-low :initarg :framebuffer-handle-low :type xcb:CARD32)
+ (framebuffer-handle-high :initarg :framebuffer-handle-high :type xcb:CARD32)
+ (framebuffer-origin-offset :initarg :framebuffer-origin-offset :type xcb:CARD32)
+ (framebuffer-size :initarg :framebuffer-size :type xcb:CARD32)
+ (framebuffer-stride :initarg :framebuffer-stride :type xcb:CARD32)
+ (device-private-size :initarg :device-private-size :type xcb:CARD32)
+ (device-private~ :initform
+ '(name device-private type xcb:CARD32 size
+ (xcb:-fieldref 'device-private-size))
+ :type xcb:-list)
+ (device-private :initarg :device-private :type xcb:-ignore)))
+
+(defclass xcb:xf86dri:AuthConnection
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (magic :initarg :magic :type xcb:CARD32)))
+(defclass xcb:xf86dri:AuthConnection~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (authenticated :initarg :authenticated :type xcb:CARD32)))
+
+
+
+(provide 'xcb-xf86dri)
+
+;;; xcb-xf86dri.el ends here
diff --git a/elpa/xelb-0.20/xcb-xf86dri.elc b/elpa/xelb-0.20/xcb-xf86dri.elc
new file mode 100644
index 0000000..096c081
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xf86dri.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xf86vidmode.el b/elpa/xelb-0.20/xcb-xf86vidmode.el
new file mode 100644
index 0000000..30faa8a
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xf86vidmode.el
@@ -0,0 +1,550 @@
+;;; xcb-xf86vidmode.el --- X11 XF86VidMode extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xf86vidmode.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xf86vidmode:-extension-xname "XFree86-VidModeExtension")
+(defconst xcb:xf86vidmode:-extension-name "XF86VidMode")
+(defconst xcb:xf86vidmode:-major-version 2)
+(defconst xcb:xf86vidmode:-minor-version 2)
+
+(xcb:deftypealias 'xcb:xf86vidmode:SYNCRANGE 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:xf86vidmode:DOTCLOCK 'xcb:CARD32)
+
+(defconst xcb:xf86vidmode:ModeFlag:Positive_HSync 1)
+(defconst xcb:xf86vidmode:ModeFlag:Negative_HSync 2)
+(defconst xcb:xf86vidmode:ModeFlag:Positive_VSync 4)
+(defconst xcb:xf86vidmode:ModeFlag:Negative_VSync 8)
+(defconst xcb:xf86vidmode:ModeFlag:Interlace 16)
+(defconst xcb:xf86vidmode:ModeFlag:Composite_Sync 32)
+(defconst xcb:xf86vidmode:ModeFlag:Positive_CSync 64)
+(defconst xcb:xf86vidmode:ModeFlag:Negative_CSync 128)
+(defconst xcb:xf86vidmode:ModeFlag:HSkew 256)
+(defconst xcb:xf86vidmode:ModeFlag:Broadcast 512)
+(defconst xcb:xf86vidmode:ModeFlag:Pixmux 1024)
+(defconst xcb:xf86vidmode:ModeFlag:Double_Clock 2048)
+(defconst xcb:xf86vidmode:ModeFlag:Half_Clock 4096)
+
+(defconst xcb:xf86vidmode:ClockFlag:Programable 1)
+
+(defconst xcb:xf86vidmode:Permission:Read 1)
+(defconst xcb:xf86vidmode:Permission:Write 2)
+
+(defclass xcb:xf86vidmode:ModeInfo
+ (xcb:-struct)
+ ((dotclock :initarg :dotclock :type xcb:xf86vidmode:DOTCLOCK)
+ (hdisplay :initarg :hdisplay :type xcb:CARD16)
+ (hsyncstart :initarg :hsyncstart :type xcb:CARD16)
+ (hsyncend :initarg :hsyncend :type xcb:CARD16)
+ (htotal :initarg :htotal :type xcb:CARD16)
+ (hskew :initarg :hskew :type xcb:CARD32)
+ (vdisplay :initarg :vdisplay :type xcb:CARD16)
+ (vsyncstart :initarg :vsyncstart :type xcb:CARD16)
+ (vsyncend :initarg :vsyncend :type xcb:CARD16)
+ (vtotal :initarg :vtotal :type xcb:CARD16)
+ (pad~0 :initform 4 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (privsize :initarg :privsize :type xcb:CARD32)))
+
+(defclass xcb:xf86vidmode:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)))
+(defclass xcb:xf86vidmode:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)))
+
+(defclass xcb:xf86vidmode:GetModeLine
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xf86vidmode:GetModeLine~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (dotclock :initarg :dotclock :type xcb:xf86vidmode:DOTCLOCK)
+ (hdisplay :initarg :hdisplay :type xcb:CARD16)
+ (hsyncstart :initarg :hsyncstart :type xcb:CARD16)
+ (hsyncend :initarg :hsyncend :type xcb:CARD16)
+ (htotal :initarg :htotal :type xcb:CARD16)
+ (hskew :initarg :hskew :type xcb:CARD16)
+ (vdisplay :initarg :vdisplay :type xcb:CARD16)
+ (vsyncstart :initarg :vsyncstart :type xcb:CARD16)
+ (vsyncend :initarg :vsyncend :type xcb:CARD16)
+ (vtotal :initarg :vtotal :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~2 :initform 12 :type xcb:-pad)
+ (privsize :initarg :privsize :type xcb:CARD32)
+ (private~ :initform
+ '(name private type xcb:CARD8 size
+ (xcb:-fieldref 'privsize))
+ :type xcb:-list)
+ (private :initarg :private :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:ModModeLine
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (hdisplay :initarg :hdisplay :type xcb:CARD16)
+ (hsyncstart :initarg :hsyncstart :type xcb:CARD16)
+ (hsyncend :initarg :hsyncend :type xcb:CARD16)
+ (htotal :initarg :htotal :type xcb:CARD16)
+ (hskew :initarg :hskew :type xcb:CARD16)
+ (vdisplay :initarg :vdisplay :type xcb:CARD16)
+ (vsyncstart :initarg :vsyncstart :type xcb:CARD16)
+ (vsyncend :initarg :vsyncend :type xcb:CARD16)
+ (vtotal :initarg :vtotal :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (privsize :initarg :privsize :type xcb:CARD32)
+ (private~ :initform
+ '(name private type xcb:CARD8 size
+ (xcb:-fieldref 'privsize))
+ :type xcb:-list)
+ (private :initarg :private :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:SwitchMode
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (zoom :initarg :zoom :type xcb:CARD16)))
+
+(defclass xcb:xf86vidmode:GetMonitor
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xf86vidmode:GetMonitor~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (vendor-length :initarg :vendor-length :type xcb:CARD8)
+ (model-length :initarg :model-length :type xcb:CARD8)
+ (num-hsync :initarg :num-hsync :type xcb:CARD8)
+ (num-vsync :initarg :num-vsync :type xcb:CARD8)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (hsync~ :initform
+ '(name hsync type xcb:xf86vidmode:SYNCRANGE size
+ (xcb:-fieldref 'num-hsync))
+ :type xcb:-list)
+ (hsync :initarg :hsync :type xcb:-ignore)
+ (vsync~ :initform
+ '(name vsync type xcb:xf86vidmode:SYNCRANGE size
+ (xcb:-fieldref 'num-vsync))
+ :type xcb:-list)
+ (vsync :initarg :vsync :type xcb:-ignore)
+ (vendor~ :initform
+ '(name vendor type xcb:char size
+ (xcb:-fieldref 'vendor-length))
+ :type xcb:-list)
+ (vendor :initarg :vendor :type xcb:-ignore)
+ (alignment-pad~ :initform
+ '(name alignment-pad type xcb:void size
+ (-
+ (logand
+ (+
+ (xcb:-fieldref 'vendor-length)
+ 3)
+ (lognot 3))
+ (xcb:-fieldref 'vendor-length)))
+ :type xcb:-list)
+ (alignment-pad :initarg :alignment-pad :type xcb:-ignore)
+ (model~ :initform
+ '(name model type xcb:char size
+ (xcb:-fieldref 'model-length))
+ :type xcb:-list)
+ (model :initarg :model :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:LockModeSwitch
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (lock :initarg :lock :type xcb:CARD16)))
+
+(defclass xcb:xf86vidmode:GetAllModeLines
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xf86vidmode:GetAllModeLines~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (modecount :initarg :modecount :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (modeinfo~ :initform
+ '(name modeinfo type xcb:xf86vidmode:ModeInfo size
+ (xcb:-fieldref 'modecount))
+ :type xcb:-list)
+ (modeinfo :initarg :modeinfo :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:AddModeLine
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (dotclock :initarg :dotclock :type xcb:xf86vidmode:DOTCLOCK)
+ (hdisplay :initarg :hdisplay :type xcb:CARD16)
+ (hsyncstart :initarg :hsyncstart :type xcb:CARD16)
+ (hsyncend :initarg :hsyncend :type xcb:CARD16)
+ (htotal :initarg :htotal :type xcb:CARD16)
+ (hskew :initarg :hskew :type xcb:CARD16)
+ (vdisplay :initarg :vdisplay :type xcb:CARD16)
+ (vsyncstart :initarg :vsyncstart :type xcb:CARD16)
+ (vsyncend :initarg :vsyncend :type xcb:CARD16)
+ (vtotal :initarg :vtotal :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (privsize :initarg :privsize :type xcb:CARD32)
+ (after-dotclock :initarg :after-dotclock :type xcb:xf86vidmode:DOTCLOCK)
+ (after-hdisplay :initarg :after-hdisplay :type xcb:CARD16)
+ (after-hsyncstart :initarg :after-hsyncstart :type xcb:CARD16)
+ (after-hsyncend :initarg :after-hsyncend :type xcb:CARD16)
+ (after-htotal :initarg :after-htotal :type xcb:CARD16)
+ (after-hskew :initarg :after-hskew :type xcb:CARD16)
+ (after-vdisplay :initarg :after-vdisplay :type xcb:CARD16)
+ (after-vsyncstart :initarg :after-vsyncstart :type xcb:CARD16)
+ (after-vsyncend :initarg :after-vsyncend :type xcb:CARD16)
+ (after-vtotal :initarg :after-vtotal :type xcb:CARD16)
+ (pad~2 :initform 2 :type xcb:-pad)
+ (after-flags :initarg :after-flags :type xcb:CARD32)
+ (pad~3 :initform 12 :type xcb:-pad)
+ (private~ :initform
+ '(name private type xcb:CARD8 size
+ (xcb:-fieldref 'privsize))
+ :type xcb:-list)
+ (private :initarg :private :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:DeleteModeLine
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (dotclock :initarg :dotclock :type xcb:xf86vidmode:DOTCLOCK)
+ (hdisplay :initarg :hdisplay :type xcb:CARD16)
+ (hsyncstart :initarg :hsyncstart :type xcb:CARD16)
+ (hsyncend :initarg :hsyncend :type xcb:CARD16)
+ (htotal :initarg :htotal :type xcb:CARD16)
+ (hskew :initarg :hskew :type xcb:CARD16)
+ (vdisplay :initarg :vdisplay :type xcb:CARD16)
+ (vsyncstart :initarg :vsyncstart :type xcb:CARD16)
+ (vsyncend :initarg :vsyncend :type xcb:CARD16)
+ (vtotal :initarg :vtotal :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (privsize :initarg :privsize :type xcb:CARD32)
+ (private~ :initform
+ '(name private type xcb:CARD8 size
+ (xcb:-fieldref 'privsize))
+ :type xcb:-list)
+ (private :initarg :private :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:ValidateModeLine
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (dotclock :initarg :dotclock :type xcb:xf86vidmode:DOTCLOCK)
+ (hdisplay :initarg :hdisplay :type xcb:CARD16)
+ (hsyncstart :initarg :hsyncstart :type xcb:CARD16)
+ (hsyncend :initarg :hsyncend :type xcb:CARD16)
+ (htotal :initarg :htotal :type xcb:CARD16)
+ (hskew :initarg :hskew :type xcb:CARD16)
+ (vdisplay :initarg :vdisplay :type xcb:CARD16)
+ (vsyncstart :initarg :vsyncstart :type xcb:CARD16)
+ (vsyncend :initarg :vsyncend :type xcb:CARD16)
+ (vtotal :initarg :vtotal :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (privsize :initarg :privsize :type xcb:CARD32)
+ (private~ :initform
+ '(name private type xcb:CARD8 size
+ (xcb:-fieldref 'privsize))
+ :type xcb:-list)
+ (private :initarg :private :type xcb:-ignore)))
+(defclass xcb:xf86vidmode:ValidateModeLine~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:xf86vidmode:SwitchToMode
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD32)
+ (dotclock :initarg :dotclock :type xcb:xf86vidmode:DOTCLOCK)
+ (hdisplay :initarg :hdisplay :type xcb:CARD16)
+ (hsyncstart :initarg :hsyncstart :type xcb:CARD16)
+ (hsyncend :initarg :hsyncend :type xcb:CARD16)
+ (htotal :initarg :htotal :type xcb:CARD16)
+ (hskew :initarg :hskew :type xcb:CARD16)
+ (vdisplay :initarg :vdisplay :type xcb:CARD16)
+ (vsyncstart :initarg :vsyncstart :type xcb:CARD16)
+ (vsyncend :initarg :vsyncend :type xcb:CARD16)
+ (vtotal :initarg :vtotal :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (privsize :initarg :privsize :type xcb:CARD32)
+ (private~ :initform
+ '(name private type xcb:CARD8 size
+ (xcb:-fieldref 'privsize))
+ :type xcb:-list)
+ (private :initarg :private :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:GetViewPort
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xf86vidmode:GetViewPort~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (x :initarg :x :type xcb:CARD32)
+ (y :initarg :y :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:xf86vidmode:SetViewPort
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (x :initarg :x :type xcb:CARD32)
+ (y :initarg :y :type xcb:CARD32)))
+
+(defclass xcb:xf86vidmode:GetDotClocks
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xf86vidmode:GetDotClocks~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (flags :initarg :flags :type xcb:CARD32)
+ (clocks :initarg :clocks :type xcb:CARD32)
+ (maxclocks :initarg :maxclocks :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (clock~ :initform
+ '(name clock type xcb:CARD32 size
+ (*
+ (- 1
+ (logand
+ (xcb:-fieldref 'flags)
+ 1))
+ (xcb:-fieldref 'clocks)))
+ :type xcb:-list)
+ (clock :initarg :clock :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:SetClientVersion
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (major :initarg :major :type xcb:CARD16)
+ (minor :initarg :minor :type xcb:CARD16)))
+
+(defclass xcb:xf86vidmode:SetGamma
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (red :initarg :red :type xcb:CARD32)
+ (green :initarg :green :type xcb:CARD32)
+ (blue :initarg :blue :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)))
+
+(defclass xcb:xf86vidmode:GetGamma
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 26 :type xcb:-pad)))
+(defclass xcb:xf86vidmode:GetGamma~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (red :initarg :red :type xcb:CARD32)
+ (green :initarg :green :type xcb:CARD32)
+ (blue :initarg :blue :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)))
+
+(defclass xcb:xf86vidmode:GetGammaRamp
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (size :initarg :size :type xcb:CARD16)))
+(defclass xcb:xf86vidmode:GetGammaRamp~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (size :initarg :size :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (red~ :initform
+ '(name red type xcb:CARD16 size
+ (logand
+ (+
+ (xcb:-fieldref 'size)
+ 1)
+ (lognot 1)))
+ :type xcb:-list)
+ (red :initarg :red :type xcb:-ignore)
+ (green~ :initform
+ '(name green type xcb:CARD16 size
+ (logand
+ (+
+ (xcb:-fieldref 'size)
+ 1)
+ (lognot 1)))
+ :type xcb:-list)
+ (green :initarg :green :type xcb:-ignore)
+ (blue~ :initform
+ '(name blue type xcb:CARD16 size
+ (logand
+ (+
+ (xcb:-fieldref 'size)
+ 1)
+ (lognot 1)))
+ :type xcb:-list)
+ (blue :initarg :blue :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:SetGammaRamp
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (size :initarg :size :type xcb:CARD16)
+ (red~ :initform
+ '(name red type xcb:CARD16 size
+ (logand
+ (+
+ (xcb:-fieldref 'size)
+ 1)
+ (lognot 1)))
+ :type xcb:-list)
+ (red :initarg :red :type xcb:-ignore)
+ (green~ :initform
+ '(name green type xcb:CARD16 size
+ (logand
+ (+
+ (xcb:-fieldref 'size)
+ 1)
+ (lognot 1)))
+ :type xcb:-list)
+ (green :initarg :green :type xcb:-ignore)
+ (blue~ :initform
+ '(name blue type xcb:CARD16 size
+ (logand
+ (+
+ (xcb:-fieldref 'size)
+ 1)
+ (lognot 1)))
+ :type xcb:-list)
+ (blue :initarg :blue :type xcb:-ignore)))
+
+(defclass xcb:xf86vidmode:GetGammaRampSize
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xf86vidmode:GetGammaRampSize~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (size :initarg :size :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)))
+
+(defclass xcb:xf86vidmode:GetPermissions
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)
+ (screen :initarg :screen :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xf86vidmode:GetPermissions~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (permissions :initarg :permissions :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:xf86vidmode:BadClock
+ (xcb:-error)
+ ((~code :initform 0)))
+
+(defclass xcb:xf86vidmode:BadHTimings
+ (xcb:-error)
+ ((~code :initform 1)))
+
+(defclass xcb:xf86vidmode:BadVTimings
+ (xcb:-error)
+ ((~code :initform 2)))
+
+(defclass xcb:xf86vidmode:ModeUnsuitable
+ (xcb:-error)
+ ((~code :initform 3)))
+
+(defclass xcb:xf86vidmode:ExtensionDisabled
+ (xcb:-error)
+ ((~code :initform 4)))
+
+(defclass xcb:xf86vidmode:ClientNotLocal
+ (xcb:-error)
+ ((~code :initform 5)))
+
+(defclass xcb:xf86vidmode:ZoomLocked
+ (xcb:-error)
+ ((~code :initform 6)))
+
+(defconst xcb:xf86vidmode:error-number-class-alist
+ '((0 . xcb:xf86vidmode:BadClock)
+ (1 . xcb:xf86vidmode:BadHTimings)
+ (2 . xcb:xf86vidmode:BadVTimings)
+ (3 . xcb:xf86vidmode:ModeUnsuitable)
+ (4 . xcb:xf86vidmode:ExtensionDisabled)
+ (5 . xcb:xf86vidmode:ClientNotLocal)
+ (6 . xcb:xf86vidmode:ZoomLocked))
+ "(error-number . error-class) alist.")
+
+
+
+(provide 'xcb-xf86vidmode)
+
+;;; xcb-xf86vidmode.el ends here
diff --git a/elpa/xelb-0.20/xcb-xf86vidmode.elc b/elpa/xelb-0.20/xcb-xf86vidmode.elc
new file mode 100644
index 0000000..0bf403a
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xf86vidmode.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xfixes.el b/elpa/xelb-0.20/xcb-xfixes.el
new file mode 100644
index 0000000..da9c0c4
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xfixes.el
@@ -0,0 +1,454 @@
+;;; xcb-xfixes.el --- X11 XFixes extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xfixes.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xfixes:-extension-xname "XFIXES")
+(defconst xcb:xfixes:-extension-name "XFixes")
+(defconst xcb:xfixes:-major-version 6)
+(defconst xcb:xfixes:-minor-version 0)
+
+(require 'xcb-xproto)
+
+(require 'xcb-render)
+
+(require 'xcb-shape)
+
+(defclass xcb:xfixes:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major-version :initarg :client-major-version :type xcb:CARD32)
+ (client-minor-version :initarg :client-minor-version :type xcb:CARD32)))
+(defclass xcb:xfixes:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)))
+
+(defconst xcb:xfixes:SaveSetMode:Insert 0)
+(defconst xcb:xfixes:SaveSetMode:Delete 1)
+
+(defconst xcb:xfixes:SaveSetTarget:Nearest 0)
+(defconst xcb:xfixes:SaveSetTarget:Root 1)
+
+(defconst xcb:xfixes:SaveSetMapping:Map 0)
+(defconst xcb:xfixes:SaveSetMapping:Unmap 1)
+
+(defclass xcb:xfixes:ChangeSaveSet
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:BYTE)
+ (target :initarg :target :type xcb:BYTE)
+ (map :initarg :map :type xcb:BYTE)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defconst xcb:xfixes:SelectionEvent:SetSelectionOwner 0)
+(defconst xcb:xfixes:SelectionEvent:SelectionWindowDestroy 1)
+(defconst xcb:xfixes:SelectionEvent:SelectionClientClose 2)
+
+(defconst xcb:xfixes:SelectionEventMask:SetSelectionOwner 1)
+(defconst xcb:xfixes:SelectionEventMask:SelectionWindowDestroy 2)
+(defconst xcb:xfixes:SelectionEventMask:SelectionClientClose 4)
+
+(defclass xcb:xfixes:SelectionNotify
+ (xcb:-event)
+ ((~code :initform 0)
+ (subtype :initarg :subtype :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (window :initarg :window :type xcb:WINDOW)
+ (owner :initarg :owner :type xcb:WINDOW)
+ (selection :initarg :selection :type xcb:ATOM)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (selection-timestamp :initarg :selection-timestamp :type xcb:TIMESTAMP)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+(defclass xcb:xfixes:SelectSelectionInput
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (selection :initarg :selection :type xcb:ATOM)
+ (event-mask :initarg :event-mask :type xcb:CARD32)))
+
+(defconst xcb:xfixes:CursorNotify:DisplayCursor 0)
+
+(defconst xcb:xfixes:CursorNotifyMask:DisplayCursor 1)
+
+(defclass xcb:xfixes:CursorNotify
+ (xcb:-event)
+ ((~code :initform 1)
+ (subtype :initarg :subtype :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (window :initarg :window :type xcb:WINDOW)
+ (cursor-serial :initarg :cursor-serial :type xcb:CARD32)
+ (timestamp :initarg :timestamp :type xcb:TIMESTAMP)
+ (name :initarg :name :type xcb:ATOM)
+ (pad~0 :initform 12 :type xcb:-pad)))
+
+(defclass xcb:xfixes:SelectCursorInput
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (event-mask :initarg :event-mask :type xcb:CARD32)))
+
+(defclass xcb:xfixes:GetCursorImage
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)))
+(defclass xcb:xfixes:GetCursorImage~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (xhot :initarg :xhot :type xcb:CARD16)
+ (yhot :initarg :yhot :type xcb:CARD16)
+ (cursor-serial :initarg :cursor-serial :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (cursor-image~ :initform
+ '(name cursor-image type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'width)
+ (xcb:-fieldref 'height)))
+ :type xcb:-list)
+ (cursor-image :initarg :cursor-image :type xcb:-ignore)))
+
+(xcb:deftypealias 'xcb:xfixes:REGION 'xcb:-u4)
+
+(defclass xcb:xfixes:BadRegion
+ (xcb:-error)
+ ((~code :initform 0)))
+
+(defconst xcb:xfixes:Region:None 0)
+
+(defclass xcb:xfixes:CreateRegion
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size nil)
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defclass xcb:xfixes:CreateRegionFromBitmap
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (bitmap :initarg :bitmap :type xcb:PIXMAP)))
+
+(defclass xcb:xfixes:CreateRegionFromWindow
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (window :initarg :window :type xcb:WINDOW)
+ (kind :initarg :kind :type xcb:shape:KIND)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xfixes:CreateRegionFromGC
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (gc :initarg :gc :type xcb:GCONTEXT)))
+
+(defclass xcb:xfixes:CreateRegionFromPicture
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (picture :initarg :picture :type xcb:render:PICTURE)))
+
+(defclass xcb:xfixes:DestroyRegion
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)))
+
+(defclass xcb:xfixes:SetRegion
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size nil)
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defclass xcb:xfixes:CopyRegion
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (source :initarg :source :type xcb:xfixes:REGION)
+ (destination :initarg :destination :type xcb:xfixes:REGION)))
+
+(defclass xcb:xfixes:UnionRegion
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (source1 :initarg :source1 :type xcb:xfixes:REGION)
+ (source2 :initarg :source2 :type xcb:xfixes:REGION)
+ (destination :initarg :destination :type xcb:xfixes:REGION)))
+
+(defclass xcb:xfixes:IntersectRegion
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (source1 :initarg :source1 :type xcb:xfixes:REGION)
+ (source2 :initarg :source2 :type xcb:xfixes:REGION)
+ (destination :initarg :destination :type xcb:xfixes:REGION)))
+
+(defclass xcb:xfixes:SubtractRegion
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (source1 :initarg :source1 :type xcb:xfixes:REGION)
+ (source2 :initarg :source2 :type xcb:xfixes:REGION)
+ (destination :initarg :destination :type xcb:xfixes:REGION)))
+
+(defclass xcb:xfixes:InvertRegion
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (source :initarg :source :type xcb:xfixes:REGION)
+ (bounds :initarg :bounds :type xcb:RECTANGLE)
+ (destination :initarg :destination :type xcb:xfixes:REGION)))
+
+(defclass xcb:xfixes:TranslateRegion
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (dx :initarg :dx :type xcb:INT16)
+ (dy :initarg :dy :type xcb:INT16)))
+
+(defclass xcb:xfixes:RegionExtents
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (source :initarg :source :type xcb:xfixes:REGION)
+ (destination :initarg :destination :type xcb:xfixes:REGION)))
+
+(defclass xcb:xfixes:FetchRegion
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (region :initarg :region :type xcb:xfixes:REGION)))
+(defclass xcb:xfixes:FetchRegion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (extents :initarg :extents :type xcb:RECTANGLE)
+ (pad~1 :initform 16 :type xcb:-pad)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size
+ (/
+ (xcb:-fieldref 'length)
+ 2))
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defclass xcb:xfixes:SetGCClipRegion
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (x-origin :initarg :x-origin :type xcb:INT16)
+ (y-origin :initarg :y-origin :type xcb:INT16)))
+
+(defclass xcb:xfixes:SetWindowShapeRegion
+ (xcb:-request)
+ ((~opcode :initform 21 :type xcb:-u1)
+ (dest :initarg :dest :type xcb:WINDOW)
+ (dest-kind :initarg :dest-kind :type xcb:shape:KIND)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (x-offset :initarg :x-offset :type xcb:INT16)
+ (y-offset :initarg :y-offset :type xcb:INT16)
+ (region :initarg :region :type xcb:xfixes:REGION)))
+
+(defclass xcb:xfixes:SetPictureClipRegion
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)
+ (picture :initarg :picture :type xcb:render:PICTURE)
+ (region :initarg :region :type xcb:xfixes:REGION)
+ (x-origin :initarg :x-origin :type xcb:INT16)
+ (y-origin :initarg :y-origin :type xcb:INT16)))
+
+(defclass xcb:xfixes:SetCursorName
+ (xcb:-request)
+ ((~opcode :initform 23 :type xcb:-u1)
+ (cursor :initarg :cursor :type xcb:CURSOR)
+ (nbytes :initarg :nbytes :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'nbytes))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:xfixes:GetCursorName
+ (xcb:-request)
+ ((~opcode :initform 24 :type xcb:-u1)
+ (cursor :initarg :cursor :type xcb:CURSOR)))
+(defclass xcb:xfixes:GetCursorName~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (atom :initarg :atom :type xcb:ATOM)
+ (nbytes :initarg :nbytes :type xcb:CARD16)
+ (pad~1 :initform 18 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'nbytes))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:xfixes:GetCursorImageAndName
+ (xcb:-request)
+ ((~opcode :initform 25 :type xcb:-u1)))
+(defclass xcb:xfixes:GetCursorImageAndName~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (xhot :initarg :xhot :type xcb:CARD16)
+ (yhot :initarg :yhot :type xcb:CARD16)
+ (cursor-serial :initarg :cursor-serial :type xcb:CARD32)
+ (cursor-atom :initarg :cursor-atom :type xcb:ATOM)
+ (nbytes :initarg :nbytes :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (cursor-image~ :initform
+ '(name cursor-image type xcb:CARD32 size
+ (*
+ (xcb:-fieldref 'width)
+ (xcb:-fieldref 'height)))
+ :type xcb:-list)
+ (cursor-image :initarg :cursor-image :type xcb:-ignore)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'nbytes))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:xfixes:ChangeCursor
+ (xcb:-request)
+ ((~opcode :initform 26 :type xcb:-u1)
+ (source :initarg :source :type xcb:CURSOR)
+ (destination :initarg :destination :type xcb:CURSOR)))
+
+(defclass xcb:xfixes:ChangeCursorByName
+ (xcb:-request)
+ ((~opcode :initform 27 :type xcb:-u1)
+ (src :initarg :src :type xcb:CURSOR)
+ (nbytes :initarg :nbytes :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'nbytes))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:xfixes:ExpandRegion
+ (xcb:-request)
+ ((~opcode :initform 28 :type xcb:-u1)
+ (source :initarg :source :type xcb:xfixes:REGION)
+ (destination :initarg :destination :type xcb:xfixes:REGION)
+ (left :initarg :left :type xcb:CARD16)
+ (right :initarg :right :type xcb:CARD16)
+ (top :initarg :top :type xcb:CARD16)
+ (bottom :initarg :bottom :type xcb:CARD16)))
+
+(defclass xcb:xfixes:HideCursor
+ (xcb:-request)
+ ((~opcode :initform 29 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:xfixes:ShowCursor
+ (xcb:-request)
+ ((~opcode :initform 30 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(xcb:deftypealias 'xcb:xfixes:BARRIER 'xcb:-u4)
+
+(defconst xcb:xfixes:BarrierDirections:PositiveX 1)
+(defconst xcb:xfixes:BarrierDirections:PositiveY 2)
+(defconst xcb:xfixes:BarrierDirections:NegativeX 4)
+(defconst xcb:xfixes:BarrierDirections:NegativeY 8)
+
+(defclass xcb:xfixes:CreatePointerBarrier
+ (xcb:-request)
+ ((~opcode :initform 31 :type xcb:-u1)
+ (barrier :initarg :barrier :type xcb:xfixes:BARRIER)
+ (window :initarg :window :type xcb:WINDOW)
+ (x1 :initarg :x1 :type xcb:CARD16)
+ (y1 :initarg :y1 :type xcb:CARD16)
+ (x2 :initarg :x2 :type xcb:CARD16)
+ (y2 :initarg :y2 :type xcb:CARD16)
+ (directions :initarg :directions :type xcb:CARD32)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (num-devices :initarg :num-devices :type xcb:CARD16)
+ (devices~ :initform
+ '(name devices type xcb:CARD16 size
+ (xcb:-fieldref 'num-devices))
+ :type xcb:-list)
+ (devices :initarg :devices :type xcb:-ignore)))
+
+(defclass xcb:xfixes:DeletePointerBarrier
+ (xcb:-request)
+ ((~opcode :initform 32 :type xcb:-u1)
+ (barrier :initarg :barrier :type xcb:xfixes:BARRIER)))
+
+(defconst xcb:xfixes:ClientDisconnectFlags:Default 0)
+(defconst xcb:xfixes:ClientDisconnectFlags:Terminate 1)
+
+(defclass xcb:xfixes:SetClientDisconnectMode
+ (xcb:-request)
+ ((~opcode :initform 33 :type xcb:-u1)
+ (disconnect-mode :initarg :disconnect-mode :type xcb:CARD32)))
+
+(defclass xcb:xfixes:GetClientDisconnectMode
+ (xcb:-request)
+ ((~opcode :initform 34 :type xcb:-u1)))
+(defclass xcb:xfixes:GetClientDisconnectMode~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (disconnect-mode :initarg :disconnect-mode :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defconst xcb:xfixes:error-number-class-alist
+ '((0 . xcb:xfixes:BadRegion))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:xfixes:event-number-class-alist
+ '((0 . xcb:xfixes:SelectionNotify)
+ (1 . xcb:xfixes:CursorNotify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-xfixes)
+
+;;; xcb-xfixes.el ends here
diff --git a/elpa/xelb-0.20/xcb-xfixes.elc b/elpa/xelb-0.20/xcb-xfixes.elc
new file mode 100644
index 0000000..93b03b8
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xfixes.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xim.el b/elpa/xelb-0.20/xcb-xim.el
new file mode 100644
index 0000000..be71f5b
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xim.el
@@ -0,0 +1,1022 @@
+;;; xcb-xim.el --- XIM Protocol -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library implements the X Input Method Protocol.
+
+;; Please note that the byte order of an XIM packet can be different from that
+;; of X packets. Moreover, if you are writing an XIM server, the byte order is
+;; actually specified by the client. Therefore we provide a different global
+;; variable `xim:lsb' to indicate the byte order of classes in this library.
+;; You should let-bind it whenever creating new objects.
+
+;; Todo:
+;; + Add extension support.
+
+;; References:
+;; + XIM (http://www.x.org/releases/X11R7.7/doc/libX11/XIM/xim.txt)
+
+;;; Code:
+
+(require 'xcb-types)
+(require 'xcb-xlib)
+
+;;;; Protocol number
+
+(defconst xim:opcode:connect 1)
+(defconst xim:opcode:connect-reply 2)
+(defconst xim:opcode:disconnect 3)
+(defconst xim:opcode:disconnect-reply 4)
+
+(defconst xim:opcode:auth-required 10)
+(defconst xim:opcode:auth-reply 11)
+(defconst xim:opcode:auth-next 12)
+(defconst xim:opcode:auth-setup 13)
+(defconst xim:opcode:auth-ng 14)
+
+(defconst xim:opcode:error 20)
+
+(defconst xim:opcode:open 30)
+(defconst xim:opcode:open-reply 31)
+(defconst xim:opcode:close 32)
+(defconst xim:opcode:close-reply 33)
+(defconst xim:opcode:register-triggerkeys 34)
+(defconst xim:opcode:trigger-notify 35)
+(defconst xim:opcode:trigger-notify-reply 36)
+(defconst xim:opcode:set-event-mask 37)
+(defconst xim:opcode:encoding-negotiation 38)
+(defconst xim:opcode:encoding-negotiation-reply 39)
+(defconst xim:opcode:query-extension 40)
+(defconst xim:opcode:query-extension-reply 41)
+(defconst xim:opcode:set-im-values 42)
+(defconst xim:opcode:set-im-values-reply 43)
+(defconst xim:opcode:get-im-values 44)
+(defconst xim:opcode:get-im-values-reply 45)
+
+(defconst xim:opcode:create-ic 50)
+(defconst xim:opcode:create-ic-reply 51)
+(defconst xim:opcode:destroy-ic 52)
+(defconst xim:opcode:destroy-ic-reply 53)
+(defconst xim:opcode:set-ic-values 54)
+(defconst xim:opcode:set-ic-values-reply 55)
+(defconst xim:opcode:get-ic-values 56)
+(defconst xim:opcode:get-ic-values-reply 57)
+(defconst xim:opcode:set-ic-focus 58)
+(defconst xim:opcode:unset-ic-focus 59)
+(defconst xim:opcode:forward-event 60)
+(defconst xim:opcode:sync 61)
+(defconst xim:opcode:sync-reply 62)
+(defconst xim:opcode:commit 63)
+(defconst xim:opcode:reset-ic 64)
+(defconst xim:opcode:reset-ic-reply 65)
+
+(defconst xim:opcode:geometry 70)
+(defconst xim:opcode:str-conversion 71)
+(defconst xim:opcode:str-conversion-reply 72)
+(defconst xim:opcode:preedit-start 73)
+(defconst xim:opcode:preedit-start-reply 74)
+(defconst xim:opcode:preedit-draw 75)
+(defconst xim:opcode:preedit-caret 76)
+(defconst xim:opcode:preedit-caret-reply 77)
+(defconst xim:opcode:preedit-done 78)
+(defconst xim:opcode:status-start 79)
+(defconst xim:opcode:status-draw 80)
+(defconst xim:opcode:status-done 81)
+(defconst xim:opcode:preeditstate 82)
+
+;;;; Basic requests packet format
+
+(eval-and-compile
+ (defvar xim:lsb xcb:lsb "Non-nil for LSB first, nil otherwise.
+
+Consider let-bind it rather than change its global value."))
+
+(defclass xim:-struct (xcb:-struct)
+ ((~lsb :initform (symbol-value 'xim:lsb)))
+ :documentation "Struct type for XIM.")
+
+(defclass xim:-request (xim:-struct)
+ ((~major-opcode :type xcb:CARD8)
+ (~minor-opcode :initform 0 :type xcb:CARD8)
+ (~length :initform 0 :type xcb:CARD16))
+ :documentation "XIM request type.")
+
+(cl-defmethod xcb:marshal ((obj xim:-request))
+ "Return the byte-array representation of XIM request OBJ."
+ (let ((result (cl-call-next-method obj)))
+ (vconcat (substring result 0 2)
+ (funcall (if (slot-value obj '~lsb)
+ #'xcb:-pack-u2-lsb
+ #'xcb:-pack-u2)
+ (1- (/ (length result) 4)))
+ (substring result 4))))
+
+;;;; Data types
+
+(xcb:deftypealias 'xim:BITMASK16 'xcb:CARD16)
+
+(xcb:deftypealias 'xim:BITMASK32 'xcb:CARD32)
+
+(defsubst xim:PADDING (N)
+ "Pad N to 4 bytes."
+ (% (- 4 (% N 4)) 4))
+
+(xcb:deftypealias 'xim:LPCE 'xcb:char)
+
+(defclass xim:STRING (xim:-struct)
+ ((length :initarg :length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xim:LPCE size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:STR (xim:-struct)
+ ((length :initarg :length :type xcb:-u1)
+ (name :initarg :name :type xcb:-ignore)
+ (name~ :initform '(name name type xcb:char size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(defclass xim:XIMATTR (xim:-struct)
+ ((id :initarg :id :type xcb:CARD16)
+ (type :initarg :type :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (attribute :initarg :attribute :type xcb:-ignore)
+ (attribute~ :initform '(name attribute type xcb:char
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:XICATTR (xim:XIMATTR)
+ nil)
+
+(defconst xim:ATTRIBUTE-VALUE-TYPE:separator-of-nestedlist 0)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:byte-data 1)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:word-data 2)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:long-data 3)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:char-data 4)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:window 5)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-styles 10)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:x-rectangle 11)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:x-point 12)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:x-font-set 13)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-hot-key-triggers 15)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-string-conversion 17)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-preedit-state 18)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-reset-state 19)
+(defconst xim:ATTRIBUTE-VALUE-TYPE:xim-nested-list #x7FFF)
+
+(defclass xim:XIMStyles (xim:-struct)
+ ((number :initarg :number :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (styles :initarg :styles :type xcb:-ignore)
+ (styles~ :initform '(name styles type xcb:CARD32
+ size (/ (xcb:-fieldref 'number) 4))
+ :type xcb:-list)))
+
+;; Auto set the number slot
+(cl-defmethod xcb:marshal ((obj xim:XIMStyles))
+ (setf (slot-value obj 'number) (* 4 (length (slot-value obj 'styles))))
+ (cl-call-next-method obj))
+
+(defclass xim:XFontSet (xim:-struct)
+ ((length :initarg :length :type xcb:-u2)
+ (base-font-name :initarg :base-font-name :type xcb:-ignore)
+ (base-font-name~ :initform '(name base-font-name type xim:LPCE
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:XIMHotKeyTriggers (xim:-struct)
+ ((number :type xcb:-u4)
+ (triggers :type xcb:-ignore)
+ (triggers~ :initform '(name triggers type xim:XIMTRIGGERKEY
+ size (xcb:-fieldref 'number))
+ :type xcb:-list)
+ (states :type xcb:-ignore)
+ (states~ :initform '(name states type xim:XIMHOTKEYSTATE
+ size (xcb:-fieldref 'number))
+ :type xcb:-list)))
+
+(defclass xim:XIMTRIGGERKEY (xim:-struct)
+ ((keysym :initarg :keysym :type xcb:CARD32)
+ (modifier :initarg :modifier :type xcb:CARD32)
+ (modifier-mask :initarg :modifier-mask :type xcb:CARD32)))
+
+(defclass xim:ENCODINGINFO (xim:-struct)
+ ((length :initarg :length :type xcb:-u2)
+ (encoding-info :initarg :encoding-info :type xcb:-ignore)
+ (encoding-info~ :initform '(name encoding-info type xcb:char
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:EXT (xim:-struct)
+ ((major-opcode :initarg :major-opcode :type xcb:CARD8)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD8)
+ (length :initarg :length :type xcb:-u2)
+ (name :initarg :name :type xcb:-ignore)
+ (name~ :initform '(name name type xcb:char size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defclass xim:XIMATTRIBUTE (xim:-struct)
+ ((id :initarg :id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (value :initarg :value :type xcb:-ignore)
+ (value~ :initform '(name value type xcb:void size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(cl-defmethod xcb:marshal ((obj xim:XIMATTRIBUTE))
+ (let ((value (slot-value obj 'value)))
+ (when (eieio-object-p value)
+ (setq value (xcb:marshal value))
+ (setf (slot-value obj 'length) (length value)
+ (slot-value obj 'value) value))
+ (cl-call-next-method obj)))
+
+(defclass xim:XICATTRIBUTE (xim:XIMATTRIBUTE)
+ nil)
+
+(defclass xim:XIMSTRCONVTEXT (xim:-struct)
+ ((feedback :initarg :feedback :type xcb:CARD16)
+ (string-length :initarg :string-length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:char
+ size (xcb:-fieldref 'string-length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'string-length))
+ :type xcb:-pad)
+ (feedbacks-length :initarg :feedbacks-length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (feedbacks :initarg :feedbacks :type xcb:-ignore)
+ (feedbacks~ :initform '(name feedbacks type xcb:void
+ size (xcb:-fieldref 'feedbacks-length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:XIMSTRCONVTEXT))
+ (let ((feedbacks (mapconcat 'xcb:marshal (slot-value obj 'feedbacks) [])))
+ (setf (slot-value obj 'feedbacks-length) (length feedbacks)
+ (slot-value obj 'feedbacks) feedbacks)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:XIMSTRCONVTEXT) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (data (slot-value obj 'feedbacks))
+ feedback feedbacks)
+ (while (< 0 (length data))
+ (setq feedback (make-instance 'xim:XIMSTRCONVFEEDBACK)
+ data (substring data (xcb:unmarshal feedback data))
+ feedbacks (nconc feedbacks (list feedback))))
+ (setf (slot-value obj 'feedbacks) feedbacks)
+ retval))
+
+(defconst xim:string-conversion:left-edge #x0000001)
+(defconst xim:string-conversion:right-edge #x0000002)
+(defconst xim:string-conversion:top-edge #x0000004)
+(defconst xim:string-conversion:bottom-edge #x0000008)
+(defconst xim:string-conversion:convealed #x0000010)
+(defconst xim:string-conversion:wrapped #x0000020)
+
+(xcb:deftypealias 'xim:XIMFEEDBACK 'xcb:CARD32)
+
+;; FIXME: different from Xlib:XIM*
+(defconst xim:reverse #x000001)
+(defconst xim:underline #x000002)
+(defconst xim:highlight #x000004)
+(defconst xim:primary #x000008)
+(defconst xim:secondary #x000010)
+(defconst xim:tertiary #x000020)
+(defconst xim:visible-to-forward #x000040)
+(defconst xim:visible-to-backward #x000080)
+(defconst xim:visible-center #x000100)
+
+(xcb:deftypealias 'xim:XIMHOTKEYSTATE 'xcb:CARD32)
+
+(defconst xim:hot-key-state:on #x0000001)
+(defconst xim:hot-key-state:off #x0000002)
+
+(xcb:deftypealias 'xim:XIMPREEDITSTATE 'xcb:CARD32)
+
+(defconst xim:preedit:enable #x0000001)
+(defconst xim:preedit:disable #x0000002)
+
+(xcb:deftypealias 'xim:XIMRESETSTATE 'xcb:CARD32)
+
+(defconst xim:initial-state #x0000001)
+(defconst xim:preserve-state #x0000002)
+
+;;;; Error notification
+
+(defclass xim:error (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:error)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (flag :initarg :flag :type xim:BITMASK16)
+ (error-code :initarg :error-code :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (type :initarg :type :type xcb:CARD16)
+ (detail :initarg :detail :type xcb:-ignore)
+ (detail~ :initform '(name detail type xcb:char
+ size (xcb:-fieldref 'length)) :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defconst xim:error-flag:invalid-both 0)
+(defconst xim:error-flag:invalid-im-id 1)
+(defconst xim:error-flag:invalid-ic-id 2)
+
+(defconst xim:error-code:bad-alloc 1)
+(defconst xim:error-code:bad-style 2)
+(defconst xim:error-code:bad-client-window 3)
+(defconst xim:error-code:bad-focus-window 4)
+(defconst xim:error-code:bad-area 5)
+(defconst xim:error-code:bad-spot-location 6)
+(defconst xim:error-code:bad-colormap 7)
+(defconst xim:error-code:bad-atom 8)
+(defconst xim:error-code:bad-pixel 9)
+(defconst xim:error-code:bad-pixmap 10)
+(defconst xim:error-code:bad-name 11)
+(defconst xim:error-code:bad-cursor 12)
+(defconst xim:error-code:bad-protocol 13)
+(defconst xim:error-code:bad-foreground 14)
+(defconst xim:error-code:bad-background 15)
+(defconst xim:error-code:locale-not-supported 16)
+(defconst xim:error-code:bad-something 999)
+
+;;;; Connection establishment
+
+(defclass xim:connect (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:connect)
+ (byte-order :initarg :byte-order :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)
+ (number :initarg :number :type xcb:CARD16)
+ (auth-names :initarg :auth-names :type xcb:-ignore)
+ (auth-names~ :initform '(name auth-names type xim:STRING
+ size (xcb:-fieldref 'number))
+ :type xcb:-list)))
+
+(defconst xim:connect-byte-order:msb-first #x42)
+(defconst xim:connect-byte-order:lsb-first #x6c)
+
+(defclass xim:auth-required (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-required)
+ (index :initarg :index :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (length :initarg :length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (data :initarg :data :type xcb:-ignore)
+ (data~ :initform '(name data type xcb:void size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~1 :initform '(xim:PADDING (slot-value length)) :type xcb:-pad)))
+
+(defclass xim:auth-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-reply)
+ (length :initarg :length :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (data :initarg :data :type xcb:-ignore)
+ (data~ :initform '(name data type xcb:void size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~1 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defclass xim:auth-next (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-next)
+ (length :initarg :length :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (data :initarg :data :type xcb:-ignore)
+ (data~ :initform '(name data type xcb:void size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~1 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defclass xim:auth-setup (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-setup)
+ (number :initarg :number :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (names :initarg :names :type xcb:-ignore)
+ (names~ :initform '(name names type xim:STRING size (xcb:-fieldref 'number))
+ :type xcb:-list)))
+
+(defclass xim:auth-ng (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:auth-ng)))
+
+(defclass xim:connect-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:connect-reply)
+ ;; Default to version 1.0
+ (major-version :initarg :major-version :initform 1 :type xcb:CARD16)
+ (minor-version :initarg :minor-version :initform 0 :type xcb:CARD16)))
+
+(defclass xim:disconnect (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:disconnect)))
+
+(defclass xim:disconnect-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:disconnect-reply)))
+
+(defclass xim:open (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:open)
+ (locale-name :initarg :locale-name :type xim:STR)
+ (pad~0 :initform '(xim:PADDING (1+ (slot-value (xcb:-fieldref 'locale-name)
+ 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:open-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:open-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (im-attrs-length :initarg :im-attrs-length :type xcb:-u2)
+ (im-attrs :initarg :im-attrs :type xcb:-ignore)
+ (im-attrs~ :initform '(name im-attrs type xcb:void
+ size (xcb:-fieldref 'im-attrs-length))
+ :type xcb:-list)
+ (ic-attrs-length :initarg :ic-attrs-length :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (ic-attrs :initarg :ic-attrs :type xcb:-ignore)
+ (ic-attrs~ :initform '(name ic-attrs type xcb:void
+ size (xcb:-fieldref 'ic-attrs-length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:open-reply))
+ (let ((im-attrs (mapconcat #'xcb:marshal (slot-value obj 'im-attrs) []))
+ (ic-attrs (mapconcat #'xcb:marshal (slot-value obj 'ic-attrs) [])))
+ (setf (slot-value obj 'im-attrs-length) (length im-attrs)
+ (slot-value obj 'im-attrs) im-attrs
+ (slot-value obj 'ic-attrs-length) (length ic-attrs)
+ (slot-value obj 'ic-attrs) ic-attrs)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:open-reply) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (im-data (slot-value obj 'im-attrs))
+ (ic-data (slot-value obj 'ic-attrs))
+ im-attr im-attrs ic-attr ic-attrs)
+ (while (< 0 (length im-data))
+ (setq im-attr (make-instance 'xim:XIMATTR)
+ im-data (substring im-data (xcb:unmarshal im-attr im-data))
+ im-attrs (nconc im-attrs (list im-attr))))
+ (while (< 0 (length ic-data))
+ (setq ic-attr (make-instance 'xim:XICATTR)
+ ic-data (substring ic-data (xcb:unmarshal ic-attr ic-data))
+ ic-attrs (nconc ic-attrs (list ic-attr))))
+ (setf (slot-value obj 'im-attrs) im-attrs
+ (slot-value obj 'ic-attrs) ic-attrs)
+ retval))
+
+(defclass xim:close (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:close)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xim:close-reply (xim:close)
+ ((~major-opcode :initform 'xim:opcode:close-reply)))
+
+;;;; Event flow control
+
+(defclass xim:set-event-mask (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-event-mask)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (forward-event-mask :initarg :forward-event-mask :type xcb:-u4)
+ (synchronous-event-mask :initarg :synchronous-event-mask :type xcb:-u4)))
+
+(defclass xim:register-triggerkeys (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:register-triggerkeys)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (on-keys-length :initarg :on-keys-length :type xcb:-u4)
+ (on-keys :initarg :on-keys :type xcb:-ignore)
+ (on-keys~ :initform '(name on-keys type xim:XIMTRIGGERKEY
+ size (/ (xcb:-fieldref 'on-keys-length) 12))
+ :type xcb:-list)
+ (off-keys-length :initarg :off-keys-length :type xcb:-u4)
+ (off-keys :initarg :off-keys :type xcb:-ignore)
+ (off-keys~ :initform '(name off-keys type xim:XIMTRIGGERKEY
+ size (/ (xcb:-fieldref 'off-keys-length) 12))
+ :type xcb:-list)))
+
+(defclass xim:trigger-nofity (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:trigger-notify)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (flag :initarg :flag :type xcb:CARD32)
+ (index :initarg :index :type xcb:CARD32)
+ (client-select-event-mask :initarg :client-select-event-mask
+ :type xcb:-u4)))
+
+(defconst xim:trigger-nofity-flag:on-keys 0)
+(defconst xim:trigger-nofity-flag:off-keys 1)
+
+(defclass xim:trigger-nofity-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:trigger-notify-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Encoding negotiation
+
+(defclass xim:encoding-negotiation (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:encoding-negotiation)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (names-length :initarg :names-length :type xcb:-u2)
+ (names :initarg :names :type xcb:-ignore)
+ (names~ :initform '(name names type xcb:void
+ size (xcb:-fieldref 'names-length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'names-length))
+ :type xcb:-pad)
+ (encodings-length :initarg :encoding-length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (encodings :initarg :encodings :type xcb:-ignore)
+ (encodings~ :initform '(name encodings type xcb:void
+ size (xcb:-fieldref 'encodings-length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:encoding-negotiation))
+ (let ((names (mapconcat #'xcb:marshal (slot-value obj 'names) []))
+ (encodings (mapconcat #'xcb:marshal (slot-value obj 'encodings) [])))
+ (setf (slot-value obj 'names-length) (length names)
+ (slot-value obj 'names) names
+ (slot-value obj 'encodings-length) (length encodings)
+ (slot-value obj 'encodings) encodings)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:encoding-negotiation) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (names-data (slot-value obj 'names))
+ (encodings-data (slot-value obj 'encodings))
+ name names encoding encodings)
+ (while (< 0 (length names-data))
+ (setq name (make-instance 'xim:STR)
+ names-data (substring names-data (xcb:unmarshal name names-data))
+ names (nconc names (list name))))
+ (while (< 0 (length encodings-data))
+ (setq encoding (make-instance 'xim:ENCODINGINFO)
+ encodings-data
+ (substring encodings-data (xcb:unmarshal encoding encodings-data))
+ encodings (nconc encodings (list encoding))))
+ (setf (slot-value obj 'names) names
+ (slot-value obj 'encodings) encodings)
+ retval))
+
+(defclass xim:encoding-negotiation-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:encoding-negotiation-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (category :initarg :category :type xcb:CARD16)
+ (index :initarg :index :type xcb:INT16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defconst xim:encoding-negotiation-reply-category:name 0)
+(defconst xim:encoding-negotiation-reply-category:data 1)
+
+;;;; Query the supported extension protocol list
+
+(defclass xim:query-extension (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:query-extension)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (extensions :initarg :extensions :type xcb:-ignore)
+ (extensions~ :initform '(name extensions type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(cl-defmethod xcb:marshal ((obj xim:query-extension))
+ (let ((extensions (mapconcat #'xcb:marshal (slot-value obj 'extensions) [])))
+ (setf (slot-value obj 'length) (length extensions)
+ (slot-value obj 'extensions) extensions)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:query-extension) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (data (slot-value obj 'extensions))
+ extension extensions)
+ (while (< 0 (length data))
+ (setq extension (make-instance 'xim:STR)
+ data (substring data (xcb:unmarshal extension data))
+ extensions (nconc extensions (list extension))))
+ (setf (slot-value obj 'extensions) extensions)
+ retval))
+
+(defclass xim:query-extension-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:query-extension-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (extensions :initarg :extensions :type xcb:-ignore)
+ (extensions~ :initform '(name extensions type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:query-extension-reply))
+ (let ((extensions (mapconcat 'xcb:marshal (slot-value obj 'extensions) [])))
+ (setf (slot-value obj 'length) (length extensions)
+ (slot-value obj 'extensions) extensions)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:query-extension-reply) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (data (slot-value obj 'extensions))
+ extension extensions)
+ (while (< 0 (length data))
+ (setq extension (make-instance 'xim:EXT)
+ data (substring data (xcb:unmarshal extension data))
+ extensions (nconc extensions (list extension))))
+ (setf (slot-value obj 'extensions) extensions)
+ retval))
+
+;;;; Setting IM values
+
+(defclass xim:set-im-values (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-im-values)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (im-attributes :initarg :im-attributes :type xcb:-ignore)
+ (im-attributes~ :initform '(name im-attributes type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:set-im-values))
+ (let ((im-attributes (mapconcat #'xcb:marshal
+ (slot-value obj 'im-attributes) [])))
+ (setf (slot-value obj 'length) (length im-attributes)
+ (slot-value obj 'im-attributes) im-attributes)
+ (cl-call-next-method obj)))
+
+(defclass xim:set-im-values-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-im-values-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+;;;; Getting IM values
+
+(defclass xim:get-im-values (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:get-im-values)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (im-attributes-id :initarg :im-attributes-id :type xcb:-ignore)
+ (im-attributes-id~ :initform '(name im-attributes-id type xcb:CARD16
+ size (/ (xcb:-fieldref 'length) 2))
+ :type xcb:-list)))
+
+(defclass xim:get-im-values-reply (xim:set-im-values)
+ ((~major-opcode :initform 'xim:opcode:get-im-values-reply)))
+
+;;;; Creating an IC
+
+(defclass xim:create-ic (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:create-ic)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (ic-attributes :initarg :ic-attributes :type xcb:-ignore)
+ (ic-attributes~ :initform '(name ic-attributes type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:create-ic))
+ (let ((ic-attributes (mapconcat #'xcb:marshal
+ (slot-value obj 'ic-attributes) [])))
+ (setf (slot-value obj 'length) (length ic-attributes)
+ (slot-value obj 'ic-attributes) ic-attributes)
+ (cl-call-next-method obj)))
+
+(cl-defmethod xcb:unmarshal ((obj xim:create-ic) byte-array)
+ (let ((retval (cl-call-next-method obj byte-array))
+ (data (slot-value obj 'ic-attributes))
+ ic-attribute ic-attributes)
+ (while (< 0 (length data))
+ (setq ic-attribute (make-instance 'xim:XICATTRIBUTE)
+ data (substring data (xcb:unmarshal ic-attribute data))
+ ic-attributes (nconc ic-attributes (list ic-attribute))))
+ (setf (slot-value obj 'ic-attributes) ic-attributes)
+ retval))
+
+(defclass xim:create-ic-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:create-ic-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Destroy the IC
+
+(defclass xim:destroy-ic (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:destroy-ic)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:destroy-ic-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:destroy-ic-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Setting IC values
+
+(defclass xim:set-ic-values (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-ic-values)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (ic-attributes :initarg :ic-attributes :type xcb:-ignore)
+ (ic-attributes~ :initform '(name ic-attributes type xcb:void
+ size (xcb:-fieldref 'length))
+ :type xcb:-list)))
+
+(cl-defmethod xcb:marshal ((obj xim:set-ic-values))
+ (let ((ic-attributes (mapconcat 'xcb:marshal
+ (slot-value obj 'ic-attributes) [])))
+ (setf (slot-value obj 'length) (length ic-attributes)
+ (slot-value obj 'ic-attributes) ic-attributes)
+ (cl-call-next-method obj)))
+
+(defclass xim:set-ic-values-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-ic-values-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Getting IC values
+
+(defclass xim:get-ic-values (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:get-ic-values)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (ic-attributes-id :initarg :ic-attributes-id :type xcb:-ignore)
+ (ic-attributes-id~ :initform '(name ic-attributes-id type xcb:CARD16
+ size (/ (xcb:-fieldref 'length) 2))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+(defclass xim:get-ic-values-reply (xim:set-ic-values)
+ ((~major-opcode :initform 'xim:opcode:get-ic-values-reply)))
+
+;;;; Setting IC focus
+
+(defclass xim:set-ic-focus (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:set-ic-focus)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Unsetting IC focus
+
+(defclass xim:unset-ic-focus (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:unset-ic-focus)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Filtering events
+
+(defclass xim:forward-event (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:forward-event)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (flag :initarg :flag :type xim:BITMASK16)
+ (serial-number :initarg :serial-number :type xcb:CARD16)
+ (event :initarg :event :type xcb:-ignore)
+ (event~ :initform '(name event type xcb:void size 32) :type xcb:-list)))
+
+(defconst xim:forward-event-flag:synchronous 1)
+(defconst xim:forward-event-flag:request-filtering 2)
+(defconst xim:forward-event-flag:request-lookupstring 4)
+
+;;;; Synchronizing with the IM server
+
+(defclass xim:sync (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:sync)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:sync-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:sync-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;;;; Sending a committed string
+
+(defclass xim:commit (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:commit)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (flag :initarg :flag :type xim:BITMASK16)))
+
+(defconst xim:commit-flag:synchronous 1)
+;; FIXME: different from Xlib:XLookup*
+(defconst xim:commit-flag:x-lookup-chars 2)
+(defconst xim:commit-flag:x-lookup-key-sym 4)
+(defconst xim:commit-flag:x-lookup-both 6)
+
+(defclass xim:commit-x-lookup-key-sym (xim:commit)
+ ((flag :initform 'xim:commit-flag:x-lookup-key-sym)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (key-sym :initarg :key-sym :type xcb:KEYSYM)))
+
+(defclass xim:commit-x-lookup-chars (xim:commit)
+ ((flag :initform 'xim:commit-flag:x-lookup-chars)
+ (length :initarg :length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:BYTE size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~1 :initform '(xim:PADDING (xcb:-fieldref 'length)) :type xcb:-pad)))
+
+(defclass xim:commit-x-lookup-both (xim:commit-x-lookup-key-sym
+ xim:commit-x-lookup-chars)
+ ((flag :initform 'xim:commit-flag:x-lookup-both)
+ (pad~1 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+;;;; Reset IC
+
+(defclass xim:reset-ic (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:reset-ic)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:reset-ic-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:reset-ic-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (length :initarg :length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:BYTE size (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'length)))
+ :type xcb:-pad)))
+
+;;;; Callbacks
+
+;; Negotiating geometry
+(defclass xim:geometry (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:geometry)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;; Converting a string
+(defclass xim:str-conversion (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:str-conversion)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (position :initarg :position :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (direction :initarg :direction :type xcb:CARD32)
+ (factor :initarg :factor :type xcb:CARD16)
+ (operation :initarg :operation :type xcb:CARD16)
+ (length :initarg :length :type xcb:INT16)))
+
+(defconst xim:caret-direction:forward-char 0)
+(defconst xim:caret-direction:backward-char 1)
+(defconst xim:caret-direction:forward-word 2)
+(defconst xim:caret-direction:backward-word 3)
+(defconst xim:caret-direction:caret-up 4)
+(defconst xim:caret-direction:caret-down 5)
+(defconst xim:caret-direction:next-line 6)
+(defconst xim:caret-direction:previous-line 7)
+(defconst xim:caret-direction:line-start 8)
+(defconst xim:caret-direction:line-end 9)
+(defconst xim:caret-direction:absolute-position 10)
+(defconst xim:caret-direction:dont-change 11)
+
+(defconst xim:string-conversion-operation:substitution 1)
+(defconst xim:string-conversion-operation:retrieval 2)
+
+(defclass xim:str-conversion-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:str-conversion-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (feedback :initarg :feedback :type xcb:CARD32)
+ (text :initarg :text :type xim:XIMSTRCONVTEXT)))
+
+;; Preedit callbacks
+(defclass xim:preedit-start (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-start)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:preedit-start-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-start-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (return-value :initarg :return-value :type xcb:INT32)))
+
+(defclass xim:preedit-draw (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-draw)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (caret :initarg :caret :type xcb:INT32)
+ (chg-first :initarg :chg-first :type xcb:INT32)
+ (chg-length :initarg :chg-length :type xcb:INT32)
+ (status :initarg :status :type xim:BITMASK32)
+ (string-length :initarg :string-length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:char
+ size (xcb:-fieldref 'string-length))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'string-length)))
+ :type xcb:-pad)
+ (feedback-length :initarg :feedback-length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (feedback :initarg :feedback :type xcb:-ignore)
+ (feedback~ :initform '(name feedback type xim:XIMFEEDBACK
+ size (/ (xcb:-fieldref 'feedback-length) 4))
+ :type xcb:-list)))
+
+(defconst xim:preedit-draw-status:no-string 1)
+(defconst xim:preedit-draw-status:no-feedback 2)
+
+(defclass xim:preedit-caret (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-caret)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (position :initarg :position :type xcb:INT32)
+ (direction :initarg :direction :type xcb:CARD32)
+ (style :initarg :style :type xcb:CARD32)))
+
+(defconst xim:preedit-caret-style:invisible 0)
+(defconst xim:preedit-caret-style:primary 1)
+(defconst xim:preedit-caret-style:secondary 2)
+
+(defclass xim:preedit-caret-reply (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-caret-reply)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (position :initarg :position :type xcb:CARD32)))
+
+(defclass xim:preedit-done (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preedit-done)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+;; Preedit state notify
+(defclass xim:preeditstate (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:preeditstate)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (state :initarg :state :type xim:BITMASK32)))
+
+(defconst xim:preeditstate:unknown 0)
+(defconst xim:preeditstate:enable 1)
+(defconst xim:preeditstate:disable 2)
+
+;; Status callbacks
+(defclass xim:status-start (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:status-start)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+(defclass xim:status-draw (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:status-draw)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)
+ (type :initarg :type :type xcb:CARD32)))
+
+(defconst xim:status-draw-type:text 0)
+(defconst xim:status-draw-type:bitmap 1)
+
+(defclass xim:status-draw-text (xim:status-draw)
+ ((type :initarg :type :initform 'xim:status-draw-type:text)
+ (status :initarg :status :type xim:BITMASK32)
+ (string-length :initarg :string-length :type xcb:-u2)
+ (string :initarg :string :type xcb:-ignore)
+ (string~ :initform '(name string type xcb:char
+ size (xcb:-fieldref 'string-lessp))
+ :type xcb:-list)
+ (pad~0 :initform '(xim:PADDING (+ 2 (xcb:-fieldref 'string-length)))
+ :type xcb:-pad)
+ (feedback-length :initarg :feedback-length :type xcb:-u2)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (feedback :initarg :feedback :type xcb:-ignore)
+ (feedback~ :initform '(name feedback type xim:XIMFEEDBACK
+ size (/ (xcb:-fieldref 'feedback-length) 4))
+ :type xcb:-list)))
+
+(defclass xim:status-draw-bitmap (xim:status-draw)
+ ((type :initarg :type :initform 'xim:status-draw-type:bitmap)
+ (pixmap-data :initarg :pixmap-data :type xcb:PIXMAP)))
+
+(defclass xim:status-done (xim:-request)
+ ((~major-opcode :initform 'xim:opcode:status-done)
+ (im-id :initarg :im-id :type xcb:CARD16)
+ (ic-id :initarg :ic-id :type xcb:CARD16)))
+
+
+
+(provide 'xcb-xim)
+
+;;; xcb-xim.el ends here
diff --git a/elpa/xelb-0.20/xcb-xim.elc b/elpa/xelb-0.20/xcb-xim.elc
new file mode 100644
index 0000000..a83dd64
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xim.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xinerama.el b/elpa/xelb-0.20/xcb-xinerama.el
new file mode 100644
index 0000000..f8ebc23
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xinerama.el
@@ -0,0 +1,123 @@
+;;; xcb-xinerama.el --- X11 Xinerama extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xinerama.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xinerama:-extension-xname "XINERAMA")
+(defconst xcb:xinerama:-extension-name "Xinerama")
+(defconst xcb:xinerama:-major-version 1)
+(defconst xcb:xinerama:-minor-version 1)
+
+(require 'xcb-xproto)
+
+(defclass xcb:xinerama:ScreenInfo
+ (xcb:-struct)
+ ((x-org :initarg :x-org :type xcb:INT16)
+ (y-org :initarg :y-org :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defclass xcb:xinerama:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (major :initarg :major :type xcb:CARD8)
+ (minor :initarg :minor :type xcb:CARD8)))
+(defclass xcb:xinerama:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major :initarg :major :type xcb:CARD16)
+ (minor :initarg :minor :type xcb:CARD16)))
+
+(defclass xcb:xinerama:GetState
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xinerama:GetState~reply
+ (xcb:-reply)
+ ((state :initarg :state :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:xinerama:GetScreenCount
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xinerama:GetScreenCount~reply
+ (xcb:-reply)
+ ((screen-count :initarg :screen-count :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:xinerama:GetScreenSize
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (screen :initarg :screen :type xcb:CARD32)))
+(defclass xcb:xinerama:GetScreenSize~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD32)
+ (height :initarg :height :type xcb:CARD32)
+ (window :initarg :window :type xcb:WINDOW)
+ (screen :initarg :screen :type xcb:CARD32)))
+
+(defclass xcb:xinerama:IsActive
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)))
+(defclass xcb:xinerama:IsActive~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (state :initarg :state :type xcb:CARD32)))
+
+(defclass xcb:xinerama:QueryScreens
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)))
+(defclass xcb:xinerama:QueryScreens~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (number :initarg :number :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (screen-info~ :initform
+ '(name screen-info type xcb:xinerama:ScreenInfo size
+ (xcb:-fieldref 'number))
+ :type xcb:-list)
+ (screen-info :initarg :screen-info :type xcb:-ignore)))
+
+
+
+(provide 'xcb-xinerama)
+
+;;; xcb-xinerama.el ends here
diff --git a/elpa/xelb-0.20/xcb-xinerama.elc b/elpa/xelb-0.20/xcb-xinerama.elc
new file mode 100644
index 0000000..42f6b31
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xinerama.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xinput.el b/elpa/xelb-0.20/xcb-xinput.el
new file mode 100644
index 0000000..a0904a9
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xinput.el
@@ -0,0 +1,2976 @@
+;;; xcb-xinput.el --- X11 Input extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xinput.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xinput:-extension-xname "XInputExtension")
+(defconst xcb:xinput:-extension-name "Input")
+(defconst xcb:xinput:-major-version 2)
+(defconst xcb:xinput:-minor-version 4)
+
+(require 'xcb-xfixes)
+
+(require 'xcb-xproto)
+
+(xcb:deftypealias 'xcb:xinput:EventClass 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:xinput:KeyCode 'xcb:CARD8)
+
+(xcb:deftypealias 'xcb:xinput:DeviceId 'xcb:CARD16)
+
+(xcb:deftypealias 'xcb:xinput:FP1616 'xcb:INT32)
+
+(defclass xcb:xinput:FP3232
+ (xcb:-struct)
+ ((integral :initarg :integral :type xcb:INT32)
+ (frac :initarg :frac :type xcb:CARD32)))
+
+(defclass xcb:xinput:GetExtensionVersion
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+(defclass xcb:xinput:GetExtensionVersion~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (server-major :initarg :server-major :type xcb:CARD16)
+ (server-minor :initarg :server-minor :type xcb:CARD16)
+ (present :initarg :present :type xcb:BOOL)
+ (pad~0 :initform 19 :type xcb:-pad)))
+
+(defconst xcb:xinput:DeviceUse:IsXPointer 0)
+(defconst xcb:xinput:DeviceUse:IsXKeyboard 1)
+(defconst xcb:xinput:DeviceUse:IsXExtensionDevice 2)
+(defconst xcb:xinput:DeviceUse:IsXExtensionKeyboard 3)
+(defconst xcb:xinput:DeviceUse:IsXExtensionPointer 4)
+
+(defconst xcb:xinput:InputClass:Key 0)
+(defconst xcb:xinput:InputClass:Button 1)
+(defconst xcb:xinput:InputClass:Valuator 2)
+(defconst xcb:xinput:InputClass:Feedback 3)
+(defconst xcb:xinput:InputClass:Proximity 4)
+(defconst xcb:xinput:InputClass:Focus 5)
+(defconst xcb:xinput:InputClass:Other 6)
+
+(defconst xcb:xinput:ValuatorMode:Relative 0)
+(defconst xcb:xinput:ValuatorMode:Absolute 1)
+
+(defclass xcb:xinput:DeviceInfo
+ (xcb:-struct)
+ ((device-type :initarg :device-type :type xcb:ATOM)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (num-class-info :initarg :num-class-info :type xcb:CARD8)
+ (device-use :initarg :device-use :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:xinput:KeyInfo
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD8)
+ (min-keycode :initarg :min-keycode :type xcb:xinput:KeyCode)
+ (max-keycode :initarg :max-keycode :type xcb:xinput:KeyCode)
+ (num-keys :initarg :num-keys :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xinput:ButtonInfo
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD8)
+ (num-buttons :initarg :num-buttons :type xcb:CARD16)))
+
+(defclass xcb:xinput:AxisInfo
+ (xcb:-struct)
+ ((resolution :initarg :resolution :type xcb:CARD32)
+ (minimum :initarg :minimum :type xcb:INT32)
+ (maximum :initarg :maximum :type xcb:INT32)))
+
+(defclass xcb:xinput:ValuatorInfo
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD8)
+ (axes-len :initarg :axes-len :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (motion-size :initarg :motion-size :type xcb:CARD32)
+ (axes~ :initform
+ '(name axes type xcb:xinput:AxisInfo size
+ (xcb:-fieldref 'axes-len))
+ :type xcb:-list)
+ (axes :initarg :axes :type xcb:-ignore)))
+
+(defclass xcb:xinput:InputInfo
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD8)
+ (info :initform
+ '(expression
+ (xcb:-fieldref 'class-id)
+ cases
+ (((0)
+ min-keycode max-keycode num-keys pad~0)
+ ((1)
+ num-buttons)
+ ((2)
+ pad~1 axes-len mode motion-size axes~)))
+ :type xcb:-switch)
+ (min-keycode :initarg :min-keycode :type xcb:xinput:KeyCode)
+ (max-keycode :initarg :max-keycode :type xcb:xinput:KeyCode)
+ (num-keys :initarg :num-keys :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (num-buttons :initarg :num-buttons :type xcb:CARD16)
+ (pad~1 :initform
+ [4 2]
+ :type xcb:-pad-align)
+ (axes-len :initarg :axes-len :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (motion-size :initarg :motion-size :type xcb:CARD32)
+ (axes~ :initform
+ '(name axes type xcb:xinput:AxisInfo size
+ (xcb:-fieldref 'axes-len))
+ :type xcb:-list)
+ (axes :initarg :axes :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeviceName
+ (xcb:-struct)
+ ((len :initarg :len :type xcb:CARD8)
+ (string~ :initform
+ '(name string type xcb:char size
+ (xcb:-fieldref 'len))
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)))
+
+(defclass xcb:xinput:ListInputDevices
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)))
+(defclass xcb:xinput:ListInputDevices~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (devices-len :initarg :devices-len :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)
+ (devices~ :initform
+ '(name devices type xcb:xinput:DeviceInfo size
+ (xcb:-fieldref 'devices-len))
+ :type xcb:-list)
+ (devices :initarg :devices :type xcb:-ignore)
+ (infos~ :initform
+ '(name infos type xcb:xinput:InputInfo size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(xcb:-fieldref 'num-class-info)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'devices))))
+ :type xcb:-list)
+ (infos :initarg :infos :type xcb:-ignore)
+ (names~ :initform
+ '(name names type xcb:STR size
+ (xcb:-fieldref 'devices-len))
+ :type xcb:-list)
+ (names :initarg :names :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)))
+
+(xcb:deftypealias 'xcb:xinput:EventTypeBase 'xcb:CARD8)
+
+(defclass xcb:xinput:InputClassInfo
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (event-type-base :initarg :event-type-base :type xcb:xinput:EventTypeBase)))
+
+(defclass xcb:xinput:OpenDevice
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:OpenDevice~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-classes :initarg :num-classes :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)
+ (class-info~ :initform
+ '(name class-info type xcb:xinput:InputClassInfo size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (class-info :initarg :class-info :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:xinput:CloseDevice
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xinput:SetDeviceMode
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xinput:SetDeviceMode~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:SelectExtensionEvent
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (classes~ :initform
+ '(name classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defclass xcb:xinput:GetSelectedExtensionEvents
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xinput:GetSelectedExtensionEvents~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-this-classes :initarg :num-this-classes :type xcb:CARD16)
+ (num-all-classes :initarg :num-all-classes :type xcb:CARD16)
+ (pad~0 :initform 20 :type xcb:-pad)
+ (this-classes~ :initform
+ '(name this-classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-this-classes))
+ :type xcb:-list)
+ (this-classes :initarg :this-classes :type xcb:-ignore)
+ (all-classes~ :initform
+ '(name all-classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-all-classes))
+ :type xcb:-list)
+ (all-classes :initarg :all-classes :type xcb:-ignore)))
+
+(defconst xcb:xinput:PropagateMode:AddToList 0)
+(defconst xcb:xinput:PropagateMode:DeleteFromList 1)
+
+(defclass xcb:xinput:ChangeDeviceDontPropagateList
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (mode :initarg :mode :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (classes~ :initform
+ '(name classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defclass xcb:xinput:GetDeviceDontPropagateList
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xinput:GetDeviceDontPropagateList~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (pad~0 :initform 22 :type xcb:-pad)
+ (classes~ :initform
+ '(name classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeviceTimeCoord
+ (xcb:-struct)
+ ((time :initarg :time :type xcb:TIMESTAMP)
+ (axisvalues~ :initform
+ '(name axisvalues type xcb:INT32 size
+ (xcb:-paramref 'num-axes))
+ :type xcb:-list)
+ (axisvalues :initarg :axisvalues :type xcb:-ignore)))
+
+(defclass xcb:xinput:GetDeviceMotionEvents
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (start :initarg :start :type xcb:TIMESTAMP)
+ (stop :initarg :stop :type xcb:TIMESTAMP)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:GetDeviceMotionEvents~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-events :initarg :num-events :type xcb:CARD32)
+ (num-axes :initarg :num-axes :type xcb:CARD8)
+ (device-mode :initarg :device-mode :type xcb:CARD8)
+ (pad~0 :initform 18 :type xcb:-pad)
+ (events~ :initform
+ '(name events type xcb:xinput:DeviceTimeCoord size
+ (xcb:-fieldref 'num-events))
+ :type xcb:-list)
+ (events :initarg :events :type xcb:-ignore)))
+
+(defclass xcb:xinput:ChangeKeyboardDevice
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:ChangeKeyboardDevice~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:ChangePointerDevice
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (x-axis :initarg :x-axis :type xcb:CARD8)
+ (y-axis :initarg :y-axis :type xcb:CARD8)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)))
+(defclass xcb:xinput:ChangePointerDevice~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:GrabDevice
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (this-device-mode :initarg :this-device-mode :type xcb:CARD8)
+ (other-device-mode :initarg :other-device-mode :type xcb:CARD8)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (classes~ :initform
+ '(name classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+(defclass xcb:xinput:GrabDevice~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:UngrabDevice
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defconst xcb:xinput:ModifierDevice:UseXKeyboard 255)
+
+(defclass xcb:xinput:GrabDeviceKey
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (modifiers :initarg :modifiers :type xcb:CARD16)
+ (modifier-device :initarg :modifier-device :type xcb:CARD8)
+ (grabbed-device :initarg :grabbed-device :type xcb:CARD8)
+ (key :initarg :key :type xcb:CARD8)
+ (this-device-mode :initarg :this-device-mode :type xcb:CARD8)
+ (other-device-mode :initarg :other-device-mode :type xcb:CARD8)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (classes~ :initform
+ '(name classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defclass xcb:xinput:UngrabDeviceKey
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (grabWindow :initarg :grabWindow :type xcb:WINDOW)
+ (modifiers :initarg :modifiers :type xcb:CARD16)
+ (modifier-device :initarg :modifier-device :type xcb:CARD8)
+ (key :initarg :key :type xcb:CARD8)
+ (grabbed-device :initarg :grabbed-device :type xcb:CARD8)))
+
+(defclass xcb:xinput:GrabDeviceButton
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (grabbed-device :initarg :grabbed-device :type xcb:CARD8)
+ (modifier-device :initarg :modifier-device :type xcb:CARD8)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (modifiers :initarg :modifiers :type xcb:CARD16)
+ (this-device-mode :initarg :this-device-mode :type xcb:CARD8)
+ (other-device-mode :initarg :other-device-mode :type xcb:CARD8)
+ (button :initarg :button :type xcb:CARD8)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (classes~ :initform
+ '(name classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defclass xcb:xinput:UngrabDeviceButton
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (modifiers :initarg :modifiers :type xcb:CARD16)
+ (modifier-device :initarg :modifier-device :type xcb:CARD8)
+ (button :initarg :button :type xcb:CARD8)
+ (grabbed-device :initarg :grabbed-device :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defconst xcb:xinput:DeviceInputMode:AsyncThisDevice 0)
+(defconst xcb:xinput:DeviceInputMode:SyncThisDevice 1)
+(defconst xcb:xinput:DeviceInputMode:ReplayThisDevice 2)
+(defconst xcb:xinput:DeviceInputMode:AsyncOtherDevices 3)
+(defconst xcb:xinput:DeviceInputMode:AsyncAll 4)
+(defconst xcb:xinput:DeviceInputMode:SyncAll 5)
+
+(defclass xcb:xinput:AllowDeviceEvents
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (mode :initarg :mode :type xcb:CARD8)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xinput:GetDeviceFocus
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:GetDeviceFocus~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (focus :initarg :focus :type xcb:WINDOW)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (revert-to :initarg :revert-to :type xcb:CARD8)
+ (pad~0 :initform 15 :type xcb:-pad)))
+
+(defclass xcb:xinput:SetDeviceFocus
+ (xcb:-request)
+ ((~opcode :initform 21 :type xcb:-u1)
+ (focus :initarg :focus :type xcb:WINDOW)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (revert-to :initarg :revert-to :type xcb:CARD8)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defconst xcb:xinput:FeedbackClass:Keyboard 0)
+(defconst xcb:xinput:FeedbackClass:Pointer 1)
+(defconst xcb:xinput:FeedbackClass:String 2)
+(defconst xcb:xinput:FeedbackClass:Integer 3)
+(defconst xcb:xinput:FeedbackClass:Led 4)
+(defconst xcb:xinput:FeedbackClass:Bell 5)
+
+(defclass xcb:xinput:KbdFeedbackState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (pitch :initarg :pitch :type xcb:CARD16)
+ (duration :initarg :duration :type xcb:CARD16)
+ (led-mask :initarg :led-mask :type xcb:CARD32)
+ (led-values :initarg :led-values :type xcb:CARD32)
+ (global-auto-repeat :initarg :global-auto-repeat :type xcb:BOOL)
+ (click :initarg :click :type xcb:CARD8)
+ (percent :initarg :percent :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (auto-repeats~ :initform
+ '(name auto-repeats type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (auto-repeats :initarg :auto-repeats :type xcb:-ignore)))
+
+(defclass xcb:xinput:PtrFeedbackState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (accel-num :initarg :accel-num :type xcb:CARD16)
+ (accel-denom :initarg :accel-denom :type xcb:CARD16)
+ (threshold :initarg :threshold :type xcb:CARD16)))
+
+(defclass xcb:xinput:IntegerFeedbackState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (resolution :initarg :resolution :type xcb:CARD32)
+ (min-value :initarg :min-value :type xcb:INT32)
+ (max-value :initarg :max-value :type xcb:INT32)))
+
+(defclass xcb:xinput:StringFeedbackState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (max-symbols :initarg :max-symbols :type xcb:CARD16)
+ (num-keysyms :initarg :num-keysyms :type xcb:CARD16)
+ (keysyms~ :initform
+ '(name keysyms type xcb:KEYSYM size
+ (xcb:-fieldref 'num-keysyms))
+ :type xcb:-list)
+ (keysyms :initarg :keysyms :type xcb:-ignore)))
+
+(defclass xcb:xinput:BellFeedbackState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (percent :initarg :percent :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (pitch :initarg :pitch :type xcb:CARD16)
+ (duration :initarg :duration :type xcb:CARD16)))
+
+(defclass xcb:xinput:LedFeedbackState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (led-mask :initarg :led-mask :type xcb:CARD32)
+ (led-values :initarg :led-values :type xcb:CARD32)))
+
+(defclass xcb:xinput:FeedbackState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (data :initform
+ '(expression
+ (xcb:-fieldref 'class-id)
+ cases
+ (((0)
+ pitch duration led-mask led-values global-auto-repeat click percent pad~0 auto-repeats~)
+ ((1)
+ pad~1 accel-num accel-denom threshold)
+ ((2)
+ max-symbols num-keysyms keysyms~)
+ ((3)
+ resolution min-value max-value)
+ ((4)
+ led-mask* led-values*)
+ ((5)
+ percent* pad~2 pitch* duration*)))
+ :type xcb:-switch)
+ (pitch :initarg :pitch :type xcb:CARD16)
+ (duration :initarg :duration :type xcb:CARD16)
+ (led-mask :initarg :led-mask :type xcb:CARD32)
+ (led-values :initarg :led-values :type xcb:CARD32)
+ (global-auto-repeat :initarg :global-auto-repeat :type xcb:BOOL)
+ (click :initarg :click :type xcb:CARD8)
+ (percent :initarg :percent :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (auto-repeats~ :initform
+ '(name auto-repeats type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (auto-repeats :initarg :auto-repeats :type xcb:-ignore)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (accel-num :initarg :accel-num :type xcb:CARD16)
+ (accel-denom :initarg :accel-denom :type xcb:CARD16)
+ (threshold :initarg :threshold :type xcb:CARD16)
+ (max-symbols :initarg :max-symbols :type xcb:CARD16)
+ (num-keysyms :initarg :num-keysyms :type xcb:CARD16)
+ (keysyms~ :initform
+ '(name keysyms type xcb:KEYSYM size
+ (xcb:-fieldref 'num-keysyms))
+ :type xcb:-list)
+ (keysyms :initarg :keysyms :type xcb:-ignore)
+ (resolution :initarg :resolution :type xcb:CARD32)
+ (min-value :initarg :min-value :type xcb:INT32)
+ (max-value :initarg :max-value :type xcb:INT32)
+ (led-mask* :initarg :led-mask* :type xcb:CARD32)
+ (led-values* :initarg :led-values* :type xcb:CARD32)
+ (percent* :initarg :percent* :type xcb:CARD8)
+ (pad~2 :initform 3 :type xcb:-pad)
+ (pitch* :initarg :pitch* :type xcb:CARD16)
+ (duration* :initarg :duration* :type xcb:CARD16)))
+
+(defclass xcb:xinput:GetFeedbackControl
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:GetFeedbackControl~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-feedbacks :initarg :num-feedbacks :type xcb:CARD16)
+ (pad~0 :initform 22 :type xcb:-pad)
+ (feedbacks~ :initform
+ '(name feedbacks type xcb:xinput:FeedbackState size
+ (xcb:-fieldref 'num-feedbacks))
+ :type xcb:-list)
+ (feedbacks :initarg :feedbacks :type xcb:-ignore)))
+
+(defclass xcb:xinput:KbdFeedbackCtl
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (key :initarg :key :type xcb:xinput:KeyCode)
+ (auto-repeat-mode :initarg :auto-repeat-mode :type xcb:CARD8)
+ (key-click-percent :initarg :key-click-percent :type xcb:INT8)
+ (bell-percent :initarg :bell-percent :type xcb:INT8)
+ (bell-pitch :initarg :bell-pitch :type xcb:INT16)
+ (bell-duration :initarg :bell-duration :type xcb:INT16)
+ (led-mask :initarg :led-mask :type xcb:CARD32)
+ (led-values :initarg :led-values :type xcb:CARD32)))
+
+(defclass xcb:xinput:PtrFeedbackCtl
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (num :initarg :num :type xcb:INT16)
+ (denom :initarg :denom :type xcb:INT16)
+ (threshold :initarg :threshold :type xcb:INT16)))
+
+(defclass xcb:xinput:IntegerFeedbackCtl
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (int-to-display :initarg :int-to-display :type xcb:INT32)))
+
+(defclass xcb:xinput:StringFeedbackCtl
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (num-keysyms :initarg :num-keysyms :type xcb:CARD16)
+ (keysyms~ :initform
+ '(name keysyms type xcb:KEYSYM size
+ (xcb:-fieldref 'num-keysyms))
+ :type xcb:-list)
+ (keysyms :initarg :keysyms :type xcb:-ignore)))
+
+(defclass xcb:xinput:BellFeedbackCtl
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (percent :initarg :percent :type xcb:INT8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (pitch :initarg :pitch :type xcb:INT16)
+ (duration :initarg :duration :type xcb:INT16)))
+
+(defclass xcb:xinput:LedFeedbackCtl
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (led-mask :initarg :led-mask :type xcb:CARD32)
+ (led-values :initarg :led-values :type xcb:CARD32)))
+
+(defclass xcb:xinput:FeedbackCtl
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD16)
+ (data :initform
+ '(expression
+ (xcb:-fieldref 'class-id)
+ cases
+ (((0)
+ key auto-repeat-mode key-click-percent bell-percent bell-pitch bell-duration led-mask led-values)
+ ((1)
+ pad~0 num denom threshold)
+ ((2)
+ pad~1 num-keysyms keysyms~)
+ ((3)
+ int-to-display)
+ ((4)
+ led-mask* led-values*)
+ ((5)
+ percent pad~2 pitch duration)))
+ :type xcb:-switch)
+ (key :initarg :key :type xcb:xinput:KeyCode)
+ (auto-repeat-mode :initarg :auto-repeat-mode :type xcb:CARD8)
+ (key-click-percent :initarg :key-click-percent :type xcb:INT8)
+ (bell-percent :initarg :bell-percent :type xcb:INT8)
+ (bell-pitch :initarg :bell-pitch :type xcb:INT16)
+ (bell-duration :initarg :bell-duration :type xcb:INT16)
+ (led-mask :initarg :led-mask :type xcb:CARD32)
+ (led-values :initarg :led-values :type xcb:CARD32)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (num :initarg :num :type xcb:INT16)
+ (denom :initarg :denom :type xcb:INT16)
+ (threshold :initarg :threshold :type xcb:INT16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (num-keysyms :initarg :num-keysyms :type xcb:CARD16)
+ (keysyms~ :initform
+ '(name keysyms type xcb:KEYSYM size
+ (xcb:-fieldref 'num-keysyms))
+ :type xcb:-list)
+ (keysyms :initarg :keysyms :type xcb:-ignore)
+ (int-to-display :initarg :int-to-display :type xcb:INT32)
+ (led-mask* :initarg :led-mask* :type xcb:CARD32)
+ (led-values* :initarg :led-values* :type xcb:CARD32)
+ (percent :initarg :percent :type xcb:INT8)
+ (pad~2 :initform 3 :type xcb:-pad)
+ (pitch :initarg :pitch :type xcb:INT16)
+ (duration :initarg :duration :type xcb:INT16)))
+
+(defconst xcb:xinput:ChangeFeedbackControlMask:KeyClickPercent 1)
+(defconst xcb:xinput:ChangeFeedbackControlMask:Percent 2)
+(defconst xcb:xinput:ChangeFeedbackControlMask:Pitch 4)
+(defconst xcb:xinput:ChangeFeedbackControlMask:Duration 8)
+(defconst xcb:xinput:ChangeFeedbackControlMask:Led 16)
+(defconst xcb:xinput:ChangeFeedbackControlMask:LedMode 32)
+(defconst xcb:xinput:ChangeFeedbackControlMask:Key 64)
+(defconst xcb:xinput:ChangeFeedbackControlMask:AutoRepeatMode 128)
+(defconst xcb:xinput:ChangeFeedbackControlMask:String 1)
+(defconst xcb:xinput:ChangeFeedbackControlMask:Integer 1)
+(defconst xcb:xinput:ChangeFeedbackControlMask:AccelNum 1)
+(defconst xcb:xinput:ChangeFeedbackControlMask:AccelDenom 2)
+(defconst xcb:xinput:ChangeFeedbackControlMask:Threshold 4)
+
+(defclass xcb:xinput:ChangeFeedbackControl
+ (xcb:-request)
+ ((~opcode :initform 23 :type xcb:-u1)
+ (mask :initarg :mask :type xcb:CARD32)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (feedback :initarg :feedback :type xcb:xinput:FeedbackCtl)))
+
+(defclass xcb:xinput:GetDeviceKeyMapping
+ (xcb:-request)
+ ((~opcode :initform 24 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (first-keycode :initarg :first-keycode :type xcb:xinput:KeyCode)
+ (count :initarg :count :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)))
+(defclass xcb:xinput:GetDeviceKeyMapping~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (keysyms-per-keycode :initarg :keysyms-per-keycode :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)
+ (keysyms~ :initform
+ '(name keysyms type xcb:KEYSYM size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (keysyms :initarg :keysyms :type xcb:-ignore)))
+
+(defclass xcb:xinput:ChangeDeviceKeyMapping
+ (xcb:-request)
+ ((~opcode :initform 25 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (first-keycode :initarg :first-keycode :type xcb:xinput:KeyCode)
+ (keysyms-per-keycode :initarg :keysyms-per-keycode :type xcb:CARD8)
+ (keycode-count :initarg :keycode-count :type xcb:CARD8)
+ (keysyms~ :initform
+ '(name keysyms type xcb:KEYSYM size
+ (*
+ (xcb:-fieldref 'keycode-count)
+ (xcb:-fieldref 'keysyms-per-keycode)))
+ :type xcb:-list)
+ (keysyms :initarg :keysyms :type xcb:-ignore)))
+
+(defclass xcb:xinput:GetDeviceModifierMapping
+ (xcb:-request)
+ ((~opcode :initform 26 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:GetDeviceModifierMapping~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (keycodes-per-modifier :initarg :keycodes-per-modifier :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)
+ (keymaps~ :initform
+ '(name keymaps type xcb:CARD8 size
+ (*
+ (xcb:-fieldref 'keycodes-per-modifier)
+ 8))
+ :type xcb:-list)
+ (keymaps :initarg :keymaps :type xcb:-ignore)))
+
+(defclass xcb:xinput:SetDeviceModifierMapping
+ (xcb:-request)
+ ((~opcode :initform 27 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (keycodes-per-modifier :initarg :keycodes-per-modifier :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (keymaps~ :initform
+ '(name keymaps type xcb:CARD8 size
+ (*
+ (xcb:-fieldref 'keycodes-per-modifier)
+ 8))
+ :type xcb:-list)
+ (keymaps :initarg :keymaps :type xcb:-ignore)))
+(defclass xcb:xinput:SetDeviceModifierMapping~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:GetDeviceButtonMapping
+ (xcb:-request)
+ ((~opcode :initform 28 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:GetDeviceButtonMapping~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (map-size :initarg :map-size :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)
+ (map~ :initform
+ '(name map type xcb:CARD8 size
+ (xcb:-fieldref 'map-size))
+ :type xcb:-list)
+ (map :initarg :map :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:xinput:SetDeviceButtonMapping
+ (xcb:-request)
+ ((~opcode :initform 29 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (map-size :initarg :map-size :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (map~ :initform
+ '(name map type xcb:CARD8 size
+ (xcb:-fieldref 'map-size))
+ :type xcb:-list)
+ (map :initarg :map :type xcb:-ignore)))
+(defclass xcb:xinput:SetDeviceButtonMapping~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:KeyState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD8)
+ (num-keys :initarg :num-keys :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (keys~ :initform
+ '(name keys type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)))
+
+(defclass xcb:xinput:ButtonState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD8)
+ (num-buttons :initarg :num-buttons :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (buttons~ :initform
+ '(name buttons type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (buttons :initarg :buttons :type xcb:-ignore)))
+
+(defconst xcb:xinput:ValuatorStateModeMask:DeviceModeAbsolute 1)
+(defconst xcb:xinput:ValuatorStateModeMask:OutOfProximity 2)
+
+(defclass xcb:xinput:ValuatorState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD8)
+ (num-valuators :initarg :num-valuators :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (valuators~ :initform
+ '(name valuators type xcb:INT32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (valuators :initarg :valuators :type xcb:-ignore)))
+
+(defclass xcb:xinput:InputState
+ (xcb:-struct)
+ ((class-id :initarg :class-id :type xcb:CARD8)
+ (len :initarg :len :type xcb:CARD8)
+ (data :initform
+ '(expression
+ (xcb:-fieldref 'class-id)
+ cases
+ (((0)
+ pad~0 num-keys pad~1 keys~)
+ ((1)
+ num-buttons pad~2 buttons~)
+ ((2)
+ pad~3 num-valuators mode valuators~)))
+ :type xcb:-switch)
+ (pad~0 :initform
+ [4 2]
+ :type xcb:-pad-align)
+ (num-keys :initarg :num-keys :type xcb:CARD8)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (keys~ :initform
+ '(name keys type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)
+ (num-buttons :initarg :num-buttons :type xcb:CARD8)
+ (pad~2 :initform 1 :type xcb:-pad)
+ (buttons~ :initform
+ '(name buttons type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (buttons :initarg :buttons :type xcb:-ignore)
+ (pad~3 :initform
+ [4 2]
+ :type xcb:-pad-align)
+ (num-valuators :initarg :num-valuators :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (valuators~ :initform
+ '(name valuators type xcb:INT32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (valuators :initarg :valuators :type xcb:-ignore)))
+
+(defclass xcb:xinput:QueryDeviceState
+ (xcb:-request)
+ ((~opcode :initform 30 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:QueryDeviceState~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-classes :initarg :num-classes :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)
+ (classes~ :initform
+ '(name classes type xcb:xinput:InputState size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeviceBell
+ (xcb:-request)
+ ((~opcode :initform 32 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (feedback-id :initarg :feedback-id :type xcb:CARD8)
+ (feedback-class :initarg :feedback-class :type xcb:CARD8)
+ (percent :initarg :percent :type xcb:INT8)))
+
+(defclass xcb:xinput:SetDeviceValuators
+ (xcb:-request)
+ ((~opcode :initform 33 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (first-valuator :initarg :first-valuator :type xcb:CARD8)
+ (num-valuators :initarg :num-valuators :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (valuators~ :initform
+ '(name valuators type xcb:INT32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (valuators :initarg :valuators :type xcb:-ignore)))
+(defclass xcb:xinput:SetDeviceValuators~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defconst xcb:xinput:DeviceControl:resolution 1)
+(defconst xcb:xinput:DeviceControl:abs_calib 2)
+(defconst xcb:xinput:DeviceControl:core 3)
+(defconst xcb:xinput:DeviceControl:enable 4)
+(defconst xcb:xinput:DeviceControl:abs_area 5)
+
+(defclass xcb:xinput:DeviceResolutionState
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (num-valuators :initarg :num-valuators :type xcb:CARD32)
+ (resolution-values~ :initform
+ '(name resolution-values type xcb:CARD32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (resolution-values :initarg :resolution-values :type xcb:-ignore)
+ (resolution-min~ :initform
+ '(name resolution-min type xcb:CARD32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (resolution-min :initarg :resolution-min :type xcb:-ignore)
+ (resolution-max~ :initform
+ '(name resolution-max type xcb:CARD32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (resolution-max :initarg :resolution-max :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeviceAbsCalibState
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (min-x :initarg :min-x :type xcb:INT32)
+ (max-x :initarg :max-x :type xcb:INT32)
+ (min-y :initarg :min-y :type xcb:INT32)
+ (max-y :initarg :max-y :type xcb:INT32)
+ (flip-x :initarg :flip-x :type xcb:CARD32)
+ (flip-y :initarg :flip-y :type xcb:CARD32)
+ (rotation :initarg :rotation :type xcb:CARD32)
+ (button-threshold :initarg :button-threshold :type xcb:CARD32)))
+
+(defclass xcb:xinput:DeviceAbsAreaState
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (offset-x :initarg :offset-x :type xcb:CARD32)
+ (offset-y :initarg :offset-y :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD32)
+ (height :initarg :height :type xcb:CARD32)
+ (screen :initarg :screen :type xcb:CARD32)
+ (following :initarg :following :type xcb:CARD32)))
+
+(defclass xcb:xinput:DeviceCoreState
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (status :initarg :status :type xcb:CARD8)
+ (iscore :initarg :iscore :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xinput:DeviceEnableState
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (enable :initarg :enable :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xinput:DeviceState
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (data :initform
+ '(expression
+ (xcb:-fieldref 'control-id)
+ cases
+ (((1)
+ num-valuators resolution-values~ resolution-min~ resolution-max~)
+ ((2)
+ min-x max-x min-y max-y flip-x flip-y rotation button-threshold)
+ ((3)
+ status iscore pad~0)
+ ((4)
+ enable pad~1)
+ ((5)
+ offset-x offset-y width height screen following)))
+ :type xcb:-switch)
+ (num-valuators :initarg :num-valuators :type xcb:CARD32)
+ (resolution-values~ :initform
+ '(name resolution-values type xcb:CARD32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (resolution-values :initarg :resolution-values :type xcb:-ignore)
+ (resolution-min~ :initform
+ '(name resolution-min type xcb:CARD32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (resolution-min :initarg :resolution-min :type xcb:-ignore)
+ (resolution-max~ :initform
+ '(name resolution-max type xcb:CARD32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (resolution-max :initarg :resolution-max :type xcb:-ignore)
+ (min-x :initarg :min-x :type xcb:INT32)
+ (max-x :initarg :max-x :type xcb:INT32)
+ (min-y :initarg :min-y :type xcb:INT32)
+ (max-y :initarg :max-y :type xcb:INT32)
+ (flip-x :initarg :flip-x :type xcb:CARD32)
+ (flip-y :initarg :flip-y :type xcb:CARD32)
+ (rotation :initarg :rotation :type xcb:CARD32)
+ (button-threshold :initarg :button-threshold :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (iscore :initarg :iscore :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (enable :initarg :enable :type xcb:CARD8)
+ (pad~1 :initform 3 :type xcb:-pad)
+ (offset-x :initarg :offset-x :type xcb:CARD32)
+ (offset-y :initarg :offset-y :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD32)
+ (height :initarg :height :type xcb:CARD32)
+ (screen :initarg :screen :type xcb:CARD32)
+ (following :initarg :following :type xcb:CARD32)))
+
+(defclass xcb:xinput:GetDeviceControl
+ (xcb:-request)
+ ((~opcode :initform 34 :type xcb:-u1)
+ (control-id :initarg :control-id :type xcb:CARD16)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)))
+(defclass xcb:xinput:GetDeviceControl~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)
+ (control :initarg :control :type xcb:xinput:DeviceState)))
+
+(defclass xcb:xinput:DeviceResolutionCtl
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (first-valuator :initarg :first-valuator :type xcb:CARD8)
+ (num-valuators :initarg :num-valuators :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (resolution-values~ :initform
+ '(name resolution-values type xcb:CARD32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (resolution-values :initarg :resolution-values :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeviceAbsCalibCtl
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (min-x :initarg :min-x :type xcb:INT32)
+ (max-x :initarg :max-x :type xcb:INT32)
+ (min-y :initarg :min-y :type xcb:INT32)
+ (max-y :initarg :max-y :type xcb:INT32)
+ (flip-x :initarg :flip-x :type xcb:CARD32)
+ (flip-y :initarg :flip-y :type xcb:CARD32)
+ (rotation :initarg :rotation :type xcb:CARD32)
+ (button-threshold :initarg :button-threshold :type xcb:CARD32)))
+
+(defclass xcb:xinput:DeviceAbsAreaCtrl
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (offset-x :initarg :offset-x :type xcb:CARD32)
+ (offset-y :initarg :offset-y :type xcb:CARD32)
+ (width :initarg :width :type xcb:INT32)
+ (height :initarg :height :type xcb:INT32)
+ (screen :initarg :screen :type xcb:INT32)
+ (following :initarg :following :type xcb:CARD32)))
+
+(defclass xcb:xinput:DeviceCoreCtrl
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xinput:DeviceEnableCtrl
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (enable :initarg :enable :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xinput:DeviceCtl
+ (xcb:-struct)
+ ((control-id :initarg :control-id :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (data :initform
+ '(expression
+ (xcb:-fieldref 'control-id)
+ cases
+ (((1)
+ first-valuator num-valuators pad~0 resolution-values~)
+ ((2)
+ min-x max-x min-y max-y flip-x flip-y rotation button-threshold)
+ ((3)
+ status pad~1)
+ ((4)
+ enable pad~2)
+ ((5)
+ offset-x offset-y width height screen following)))
+ :type xcb:-switch)
+ (first-valuator :initarg :first-valuator :type xcb:CARD8)
+ (num-valuators :initarg :num-valuators :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (resolution-values~ :initform
+ '(name resolution-values type xcb:CARD32 size
+ (xcb:-fieldref 'num-valuators))
+ :type xcb:-list)
+ (resolution-values :initarg :resolution-values :type xcb:-ignore)
+ (min-x :initarg :min-x :type xcb:INT32)
+ (max-x :initarg :max-x :type xcb:INT32)
+ (min-y :initarg :min-y :type xcb:INT32)
+ (max-y :initarg :max-y :type xcb:INT32)
+ (flip-x :initarg :flip-x :type xcb:CARD32)
+ (flip-y :initarg :flip-y :type xcb:CARD32)
+ (rotation :initarg :rotation :type xcb:CARD32)
+ (button-threshold :initarg :button-threshold :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~1 :initform 3 :type xcb:-pad)
+ (enable :initarg :enable :type xcb:CARD8)
+ (pad~2 :initform 3 :type xcb:-pad)
+ (offset-x :initarg :offset-x :type xcb:CARD32)
+ (offset-y :initarg :offset-y :type xcb:CARD32)
+ (width :initarg :width :type xcb:INT32)
+ (height :initarg :height :type xcb:INT32)
+ (screen :initarg :screen :type xcb:INT32)
+ (following :initarg :following :type xcb:CARD32)))
+
+(defclass xcb:xinput:ChangeDeviceControl
+ (xcb:-request)
+ ((~opcode :initform 35 :type xcb:-u1)
+ (control-id :initarg :control-id :type xcb:CARD16)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (control :initarg :control :type xcb:xinput:DeviceCtl)))
+(defclass xcb:xinput:ChangeDeviceControl~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:ListDeviceProperties
+ (xcb:-request)
+ ((~opcode :initform 36 :type xcb:-u1)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xinput:ListDeviceProperties~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-atoms :initarg :num-atoms :type xcb:CARD16)
+ (pad~0 :initform 22 :type xcb:-pad)
+ (atoms~ :initform
+ '(name atoms type xcb:ATOM size
+ (xcb:-fieldref 'num-atoms))
+ :type xcb:-list)
+ (atoms :initarg :atoms :type xcb:-ignore)))
+
+(defconst xcb:xinput:PropertyFormat:8Bits 8)
+(defconst xcb:xinput:PropertyFormat:16Bits 16)
+(defconst xcb:xinput:PropertyFormat:32Bits 32)
+
+(defclass xcb:xinput:ChangeDeviceProperty
+ (xcb:-request)
+ ((~opcode :initform 37 :type xcb:-u1)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (format :initarg :format :type xcb:CARD8)
+ (mode :initarg :mode :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (num-items :initarg :num-items :type xcb:CARD32)
+ (items :initform
+ '(expression
+ (xcb:-fieldref 'format)
+ cases
+ (((8)
+ data8~ pad~1)
+ ((16)
+ data16~ pad~2)
+ ((32)
+ data32~)))
+ :type xcb:-switch)
+ (data8~ :initform
+ '(name data8 type xcb:CARD8 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data8 :initarg :data8 :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (data16~ :initform
+ '(name data16 type xcb:CARD16 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data16 :initarg :data16 :type xcb:-ignore)
+ (pad~2 :initform 4 :type xcb:-pad-align)
+ (data32~ :initform
+ '(name data32 type xcb:CARD32 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data32 :initarg :data32 :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeleteDeviceProperty
+ (xcb:-request)
+ ((~opcode :initform 38 :type xcb:-u1)
+ (property :initarg :property :type xcb:ATOM)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xinput:GetDeviceProperty
+ (xcb:-request)
+ ((~opcode :initform 39 :type xcb:-u1)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (offset :initarg :offset :type xcb:CARD32)
+ (len :initarg :len :type xcb:CARD32)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (delete :initarg :delete :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xinput:GetDeviceProperty~reply
+ (xcb:-reply)
+ ((xi-reply-type :initarg :xi-reply-type :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (type :initarg :type :type xcb:ATOM)
+ (bytes-after :initarg :bytes-after :type xcb:CARD32)
+ (num-items :initarg :num-items :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD8)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 10 :type xcb:-pad)
+ (items :initform
+ '(expression
+ (xcb:-fieldref 'format)
+ cases
+ (((8)
+ data8~ pad~1)
+ ((16)
+ data16~ pad~2)
+ ((32)
+ data32~)))
+ :type xcb:-switch)
+ (data8~ :initform
+ '(name data8 type xcb:CARD8 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data8 :initarg :data8 :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (data16~ :initform
+ '(name data16 type xcb:CARD16 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data16 :initarg :data16 :type xcb:-ignore)
+ (pad~2 :initform 4 :type xcb:-pad-align)
+ (data32~ :initform
+ '(name data32 type xcb:CARD32 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data32 :initarg :data32 :type xcb:-ignore)))
+
+(defconst xcb:xinput:Device:All 0)
+(defconst xcb:xinput:Device:AllMaster 1)
+
+(defclass xcb:xinput:GroupInfo
+ (xcb:-struct)
+ ((base :initarg :base :type xcb:CARD8)
+ (latched :initarg :latched :type xcb:CARD8)
+ (locked :initarg :locked :type xcb:CARD8)
+ (effective :initarg :effective :type xcb:CARD8)))
+
+(defclass xcb:xinput:ModifierInfo
+ (xcb:-struct)
+ ((base :initarg :base :type xcb:CARD32)
+ (latched :initarg :latched :type xcb:CARD32)
+ (locked :initarg :locked :type xcb:CARD32)
+ (effective :initarg :effective :type xcb:CARD32)))
+
+(defclass xcb:xinput:XIQueryPointer
+ (xcb:-request)
+ ((~opcode :initform 40 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xinput:XIQueryPointer~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:xinput:FP1616)
+ (root-y :initarg :root-y :type xcb:xinput:FP1616)
+ (win-x :initarg :win-x :type xcb:xinput:FP1616)
+ (win-y :initarg :win-y :type xcb:xinput:FP1616)
+ (same-screen :initarg :same-screen :type xcb:BOOL)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (buttons-len :initarg :buttons-len :type xcb:CARD16)
+ (mods :initarg :mods :type xcb:xinput:ModifierInfo)
+ (group :initarg :group :type xcb:xinput:GroupInfo)
+ (buttons~ :initform
+ '(name buttons type xcb:CARD32 size
+ (xcb:-fieldref 'buttons-len))
+ :type xcb:-list)
+ (buttons :initarg :buttons :type xcb:-ignore)))
+
+(defclass xcb:xinput:XIWarpPointer
+ (xcb:-request)
+ ((~opcode :initform 41 :type xcb:-u1)
+ (src-win :initarg :src-win :type xcb:WINDOW)
+ (dst-win :initarg :dst-win :type xcb:WINDOW)
+ (src-x :initarg :src-x :type xcb:xinput:FP1616)
+ (src-y :initarg :src-y :type xcb:xinput:FP1616)
+ (src-width :initarg :src-width :type xcb:CARD16)
+ (src-height :initarg :src-height :type xcb:CARD16)
+ (dst-x :initarg :dst-x :type xcb:xinput:FP1616)
+ (dst-y :initarg :dst-y :type xcb:xinput:FP1616)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xinput:XIChangeCursor
+ (xcb:-request)
+ ((~opcode :initform 42 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (cursor :initarg :cursor :type xcb:CURSOR)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defconst xcb:xinput:HierarchyChangeType:AddMaster 1)
+(defconst xcb:xinput:HierarchyChangeType:RemoveMaster 2)
+(defconst xcb:xinput:HierarchyChangeType:AttachSlave 3)
+(defconst xcb:xinput:HierarchyChangeType:DetachSlave 4)
+
+(defconst xcb:xinput:ChangeMode:Attach 1)
+(defconst xcb:xinput:ChangeMode:Float 2)
+
+(defclass xcb:xinput:AddMaster
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (send-core :initarg :send-core :type xcb:BOOL)
+ (enable :initarg :enable :type xcb:BOOL)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:xinput:RemoveMaster
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (return-mode :initarg :return-mode :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (return-pointer :initarg :return-pointer :type xcb:xinput:DeviceId)
+ (return-keyboard :initarg :return-keyboard :type xcb:xinput:DeviceId)))
+
+(defclass xcb:xinput:AttachSlave
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (master :initarg :master :type xcb:xinput:DeviceId)))
+
+(defclass xcb:xinput:DetachSlave
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xinput:HierarchyChange
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (data :initform
+ '(expression
+ (xcb:-fieldref 'type)
+ cases
+ (((1)
+ name-len send-core enable name~ pad~0)
+ ((2)
+ deviceid return-mode pad~1 return-pointer return-keyboard)
+ ((3)
+ deviceid* master)
+ ((4)
+ deviceid** pad~2)))
+ :type xcb:-switch)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (send-core :initarg :send-core :type xcb:BOOL)
+ (enable :initarg :enable :type xcb:BOOL)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (return-mode :initarg :return-mode :type xcb:CARD8)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (return-pointer :initarg :return-pointer :type xcb:xinput:DeviceId)
+ (return-keyboard :initarg :return-keyboard :type xcb:xinput:DeviceId)
+ (deviceid* :initarg :deviceid* :type xcb:xinput:DeviceId)
+ (master :initarg :master :type xcb:xinput:DeviceId)
+ (deviceid** :initarg :deviceid** :type xcb:xinput:DeviceId)
+ (pad~2 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xinput:XIChangeHierarchy
+ (xcb:-request)
+ ((~opcode :initform 43 :type xcb:-u1)
+ (num-changes :initarg :num-changes :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (changes~ :initform
+ '(name changes type xcb:xinput:HierarchyChange size
+ (xcb:-fieldref 'num-changes))
+ :type xcb:-list)
+ (changes :initarg :changes :type xcb:-ignore)))
+
+(defclass xcb:xinput:XISetClientPointer
+ (xcb:-request)
+ ((~opcode :initform 44 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xinput:XIGetClientPointer
+ (xcb:-request)
+ ((~opcode :initform 45 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xinput:XIGetClientPointer~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (set :initarg :set :type xcb:BOOL)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~2 :initform 20 :type xcb:-pad)))
+
+(defconst xcb:xinput:XIEventMask:DeviceChanged 2)
+(defconst xcb:xinput:XIEventMask:KeyPress 4)
+(defconst xcb:xinput:XIEventMask:KeyRelease 8)
+(defconst xcb:xinput:XIEventMask:ButtonPress 16)
+(defconst xcb:xinput:XIEventMask:ButtonRelease 32)
+(defconst xcb:xinput:XIEventMask:Motion 64)
+(defconst xcb:xinput:XIEventMask:Enter 128)
+(defconst xcb:xinput:XIEventMask:Leave 256)
+(defconst xcb:xinput:XIEventMask:FocusIn 512)
+(defconst xcb:xinput:XIEventMask:FocusOut 1024)
+(defconst xcb:xinput:XIEventMask:Hierarchy 2048)
+(defconst xcb:xinput:XIEventMask:Property 4096)
+(defconst xcb:xinput:XIEventMask:RawKeyPress 8192)
+(defconst xcb:xinput:XIEventMask:RawKeyRelease 16384)
+(defconst xcb:xinput:XIEventMask:RawButtonPress 32768)
+(defconst xcb:xinput:XIEventMask:RawButtonRelease 65536)
+(defconst xcb:xinput:XIEventMask:RawMotion 131072)
+(defconst xcb:xinput:XIEventMask:TouchBegin 262144)
+(defconst xcb:xinput:XIEventMask:TouchUpdate 524288)
+(defconst xcb:xinput:XIEventMask:TouchEnd 1048576)
+(defconst xcb:xinput:XIEventMask:TouchOwnership 2097152)
+(defconst xcb:xinput:XIEventMask:RawTouchBegin 4194304)
+(defconst xcb:xinput:XIEventMask:RawTouchUpdate 8388608)
+(defconst xcb:xinput:XIEventMask:RawTouchEnd 16777216)
+(defconst xcb:xinput:XIEventMask:BarrierHit 33554432)
+(defconst xcb:xinput:XIEventMask:BarrierLeave 67108864)
+
+(defclass xcb:xinput:EventMask
+ (xcb:-struct)
+ ((deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (mask-len :initarg :mask-len :type xcb:CARD16)
+ (mask~ :initform
+ '(name mask type xcb:CARD32 size
+ (xcb:-fieldref 'mask-len))
+ :type xcb:-list)
+ (mask :initarg :mask :type xcb:-ignore)))
+
+(defclass xcb:xinput:XISelectEvents
+ (xcb:-request)
+ ((~opcode :initform 46 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (num-mask :initarg :num-mask :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (masks~ :initform
+ '(name masks type xcb:xinput:EventMask size
+ (xcb:-fieldref 'num-mask))
+ :type xcb:-list)
+ (masks :initarg :masks :type xcb:-ignore)))
+
+(defclass xcb:xinput:XIQueryVersion
+ (xcb:-request)
+ ((~opcode :initform 47 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)))
+(defclass xcb:xinput:XIQueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defconst xcb:xinput:DeviceClassType:Key 0)
+(defconst xcb:xinput:DeviceClassType:Button 1)
+(defconst xcb:xinput:DeviceClassType:Valuator 2)
+(defconst xcb:xinput:DeviceClassType:Scroll 3)
+(defconst xcb:xinput:DeviceClassType:Touch 8)
+(defconst xcb:xinput:DeviceClassType:Gesture 9)
+
+(defconst xcb:xinput:DeviceType:MasterPointer 1)
+(defconst xcb:xinput:DeviceType:MasterKeyboard 2)
+(defconst xcb:xinput:DeviceType:SlavePointer 3)
+(defconst xcb:xinput:DeviceType:SlaveKeyboard 4)
+(defconst xcb:xinput:DeviceType:FloatingSlave 5)
+
+(defconst xcb:xinput:ScrollFlags:NoEmulation 1)
+(defconst xcb:xinput:ScrollFlags:Preferred 2)
+
+(defconst xcb:xinput:ScrollType:Vertical 1)
+(defconst xcb:xinput:ScrollType:Horizontal 2)
+
+(defconst xcb:xinput:TouchMode:Direct 1)
+(defconst xcb:xinput:TouchMode:Dependent 2)
+
+(defclass xcb:xinput:ButtonClass
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (num-buttons :initarg :num-buttons :type xcb:CARD16)
+ (state~ :initform
+ '(name state type xcb:CARD32 size
+ (/
+ (+
+ (xcb:-fieldref 'num-buttons)
+ 31)
+ 32))
+ :type xcb:-list)
+ (state :initarg :state :type xcb:-ignore)
+ (labels~ :initform
+ '(name labels type xcb:ATOM size
+ (xcb:-fieldref 'num-buttons))
+ :type xcb:-list)
+ (labels :initarg :labels :type xcb:-ignore)))
+
+(defclass xcb:xinput:KeyClass
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (num-keys :initarg :num-keys :type xcb:CARD16)
+ (keys~ :initform
+ '(name keys type xcb:CARD32 size
+ (xcb:-fieldref 'num-keys))
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)))
+
+(defclass xcb:xinput:ScrollClass
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (number :initarg :number :type xcb:CARD16)
+ (scroll-type :initarg :scroll-type :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (increment :initarg :increment :type xcb:xinput:FP3232)))
+
+(defclass xcb:xinput:TouchClass
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (mode :initarg :mode :type xcb:CARD8)
+ (num-touches :initarg :num-touches :type xcb:CARD8)))
+
+(defclass xcb:xinput:GestureClass
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (num-touches :initarg :num-touches :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:xinput:ValuatorClass
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (number :initarg :number :type xcb:CARD16)
+ (label :initarg :label :type xcb:ATOM)
+ (min :initarg :min :type xcb:xinput:FP3232)
+ (max :initarg :max :type xcb:xinput:FP3232)
+ (value :initarg :value :type xcb:xinput:FP3232)
+ (resolution :initarg :resolution :type xcb:CARD32)
+ (mode :initarg :mode :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xinput:DeviceClass
+ (xcb:-struct)
+ ((~size :initform
+ '(*
+ (xcb:-fieldref 'len)
+ 4))
+ (type :initarg :type :type xcb:CARD16)
+ (len :initarg :len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (data :initform
+ '(expression
+ (xcb:-fieldref 'type)
+ cases
+ (((0)
+ pad~0 num-keys keys~)
+ ((1)
+ pad~1 num-buttons state~ labels~)
+ ((2)
+ pad~2 number label min max value resolution mode pad~3)
+ ((3)
+ pad~4 number* scroll-type pad~5 flags increment)
+ ((8)
+ mode* num-touches)
+ ((9)
+ num-touches* pad~6)))
+ :type xcb:-switch)
+ (pad~0 :initform
+ [4 2]
+ :type xcb:-pad-align)
+ (num-keys :initarg :num-keys :type xcb:CARD16)
+ (keys~ :initform
+ '(name keys type xcb:CARD32 size
+ (xcb:-fieldref 'num-keys))
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)
+ (pad~1 :initform
+ [4 2]
+ :type xcb:-pad-align)
+ (num-buttons :initarg :num-buttons :type xcb:CARD16)
+ (state~ :initform
+ '(name state type xcb:CARD32 size
+ (/
+ (+
+ (xcb:-fieldref 'num-buttons)
+ 31)
+ 32))
+ :type xcb:-list)
+ (state :initarg :state :type xcb:-ignore)
+ (labels~ :initform
+ '(name labels type xcb:ATOM size
+ (xcb:-fieldref 'num-buttons))
+ :type xcb:-list)
+ (labels :initarg :labels :type xcb:-ignore)
+ (pad~2 :initform
+ [4 2]
+ :type xcb:-pad-align)
+ (number :initarg :number :type xcb:CARD16)
+ (label :initarg :label :type xcb:ATOM)
+ (min :initarg :min :type xcb:xinput:FP3232)
+ (max :initarg :max :type xcb:xinput:FP3232)
+ (value :initarg :value :type xcb:xinput:FP3232)
+ (resolution :initarg :resolution :type xcb:CARD32)
+ (mode :initarg :mode :type xcb:CARD8)
+ (pad~3 :initform 3 :type xcb:-pad)
+ (pad~4 :initform
+ [4 2]
+ :type xcb:-pad-align)
+ (number* :initarg :number* :type xcb:CARD16)
+ (scroll-type :initarg :scroll-type :type xcb:CARD16)
+ (pad~5 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (increment :initarg :increment :type xcb:xinput:FP3232)
+ (mode* :initarg :mode* :type xcb:CARD8)
+ (num-touches :initarg :num-touches :type xcb:CARD8)
+ (num-touches* :initarg :num-touches* :type xcb:CARD8)
+ (pad~6 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:xinput:XIDeviceInfo
+ (xcb:-struct)
+ ((deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (type :initarg :type :type xcb:CARD16)
+ (attachment :initarg :attachment :type xcb:xinput:DeviceId)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (enabled :initarg :enabled :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (classes~ :initform
+ '(name classes type xcb:xinput:DeviceClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defclass xcb:xinput:XIQueryDevice
+ (xcb:-request)
+ ((~opcode :initform 48 :type xcb:-u1)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xinput:XIQueryDevice~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-infos :initarg :num-infos :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (infos~ :initform
+ '(name infos type xcb:xinput:XIDeviceInfo size
+ (xcb:-fieldref 'num-infos))
+ :type xcb:-list)
+ (infos :initarg :infos :type xcb:-ignore)))
+
+(defclass xcb:xinput:XISetFocus
+ (xcb:-request)
+ ((~opcode :initform 49 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xinput:XIGetFocus
+ (xcb:-request)
+ ((~opcode :initform 50 :type xcb:-u1)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xinput:XIGetFocus~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (focus :initarg :focus :type xcb:WINDOW)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defconst xcb:xinput:GrabOwner:NoOwner 0)
+(defconst xcb:xinput:GrabOwner:Owner 1)
+
+(defclass xcb:xinput:XIGrabDevice
+ (xcb:-request)
+ ((~opcode :initform 51 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (cursor :initarg :cursor :type xcb:CURSOR)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (mode :initarg :mode :type xcb:CARD8)
+ (paired-device-mode :initarg :paired-device-mode :type xcb:CARD8)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (mask-len :initarg :mask-len :type xcb:CARD16)
+ (mask~ :initform
+ '(name mask type xcb:CARD32 size
+ (xcb:-fieldref 'mask-len))
+ :type xcb:-list)
+ (mask :initarg :mask :type xcb:-ignore)))
+(defclass xcb:xinput:XIGrabDevice~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~1 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:XIUngrabDevice
+ (xcb:-request)
+ ((~opcode :initform 52 :type xcb:-u1)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defconst xcb:xinput:EventMode:AsyncDevice 0)
+(defconst xcb:xinput:EventMode:SyncDevice 1)
+(defconst xcb:xinput:EventMode:ReplayDevice 2)
+(defconst xcb:xinput:EventMode:AsyncPairedDevice 3)
+(defconst xcb:xinput:EventMode:AsyncPair 4)
+(defconst xcb:xinput:EventMode:SyncPair 5)
+(defconst xcb:xinput:EventMode:AcceptTouch 6)
+(defconst xcb:xinput:EventMode:RejectTouch 7)
+
+(defclass xcb:xinput:XIAllowEvents
+ (xcb:-request)
+ ((~opcode :initform 53 :type xcb:-u1)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (event-mode :initarg :event-mode :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (touchid :initarg :touchid :type xcb:CARD32)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)))
+
+(defconst xcb:xinput:GrabMode22:Sync 0)
+(defconst xcb:xinput:GrabMode22:Async 1)
+(defconst xcb:xinput:GrabMode22:Touch 2)
+
+(defconst xcb:xinput:GrabType:Button 0)
+(defconst xcb:xinput:GrabType:Keycode 1)
+(defconst xcb:xinput:GrabType:Enter 2)
+(defconst xcb:xinput:GrabType:FocusIn 3)
+(defconst xcb:xinput:GrabType:TouchBegin 4)
+(defconst xcb:xinput:GrabType:GesturePinchBegin 5)
+(defconst xcb:xinput:GrabType:GestureSwipeBegin 6)
+
+(defclass xcb:xinput:GrabModifierInfo
+ (xcb:-struct)
+ ((modifiers :initarg :modifiers :type xcb:CARD32)
+ (status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xinput:XIPassiveGrabDevice
+ (xcb:-request)
+ ((~opcode :initform 54 :type xcb:-u1)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (cursor :initarg :cursor :type xcb:CURSOR)
+ (detail :initarg :detail :type xcb:CARD32)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (num-modifiers :initarg :num-modifiers :type xcb:CARD16)
+ (mask-len :initarg :mask-len :type xcb:CARD16)
+ (grab-type :initarg :grab-type :type xcb:CARD8)
+ (grab-mode :initarg :grab-mode :type xcb:CARD8)
+ (paired-device-mode :initarg :paired-device-mode :type xcb:CARD8)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (mask~ :initform
+ '(name mask type xcb:CARD32 size
+ (xcb:-fieldref 'mask-len))
+ :type xcb:-list)
+ (mask :initarg :mask :type xcb:-ignore)
+ (modifiers~ :initform
+ '(name modifiers type xcb:CARD32 size
+ (xcb:-fieldref 'num-modifiers))
+ :type xcb:-list)
+ (modifiers :initarg :modifiers :type xcb:-ignore)))
+(defclass xcb:xinput:XIPassiveGrabDevice~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-modifiers :initarg :num-modifiers :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (modifiers~ :initform
+ '(name modifiers type xcb:xinput:GrabModifierInfo size
+ (xcb:-fieldref 'num-modifiers))
+ :type xcb:-list)
+ (modifiers :initarg :modifiers :type xcb:-ignore)))
+
+(defclass xcb:xinput:XIPassiveUngrabDevice
+ (xcb:-request)
+ ((~opcode :initform 55 :type xcb:-u1)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (detail :initarg :detail :type xcb:CARD32)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (num-modifiers :initarg :num-modifiers :type xcb:CARD16)
+ (grab-type :initarg :grab-type :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (modifiers~ :initform
+ '(name modifiers type xcb:CARD32 size
+ (xcb:-fieldref 'num-modifiers))
+ :type xcb:-list)
+ (modifiers :initarg :modifiers :type xcb:-ignore)))
+
+(defclass xcb:xinput:XIListProperties
+ (xcb:-request)
+ ((~opcode :initform 56 :type xcb:-u1)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xinput:XIListProperties~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-properties :initarg :num-properties :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (properties~ :initform
+ '(name properties type xcb:ATOM size
+ (xcb:-fieldref 'num-properties))
+ :type xcb:-list)
+ (properties :initarg :properties :type xcb:-ignore)))
+
+(defclass xcb:xinput:XIChangeProperty
+ (xcb:-request)
+ ((~opcode :initform 57 :type xcb:-u1)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (mode :initarg :mode :type xcb:CARD8)
+ (format :initarg :format :type xcb:CARD8)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (num-items :initarg :num-items :type xcb:CARD32)
+ (items :initform
+ '(expression
+ (xcb:-fieldref 'format)
+ cases
+ (((8)
+ data8~ pad~0)
+ ((16)
+ data16~ pad~1)
+ ((32)
+ data32~)))
+ :type xcb:-switch)
+ (data8~ :initform
+ '(name data8 type xcb:CARD8 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data8 :initarg :data8 :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (data16~ :initform
+ '(name data16 type xcb:CARD16 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data16 :initarg :data16 :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (data32~ :initform
+ '(name data32 type xcb:CARD32 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data32 :initarg :data32 :type xcb:-ignore)))
+
+(defclass xcb:xinput:XIDeleteProperty
+ (xcb:-request)
+ ((~opcode :initform 58 :type xcb:-u1)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (property :initarg :property :type xcb:ATOM)))
+
+(defclass xcb:xinput:XIGetProperty
+ (xcb:-request)
+ ((~opcode :initform 59 :type xcb:-u1)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (delete :initarg :delete :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (offset :initarg :offset :type xcb:CARD32)
+ (len :initarg :len :type xcb:CARD32)))
+(defclass xcb:xinput:XIGetProperty~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (type :initarg :type :type xcb:ATOM)
+ (bytes-after :initarg :bytes-after :type xcb:CARD32)
+ (num-items :initarg :num-items :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD8)
+ (pad~1 :initform 11 :type xcb:-pad)
+ (items :initform
+ '(expression
+ (xcb:-fieldref 'format)
+ cases
+ (((8)
+ data8~ pad~2)
+ ((16)
+ data16~ pad~3)
+ ((32)
+ data32~)))
+ :type xcb:-switch)
+ (data8~ :initform
+ '(name data8 type xcb:CARD8 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data8 :initarg :data8 :type xcb:-ignore)
+ (pad~2 :initform 4 :type xcb:-pad-align)
+ (data16~ :initform
+ '(name data16 type xcb:CARD16 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data16 :initarg :data16 :type xcb:-ignore)
+ (pad~3 :initform 4 :type xcb:-pad-align)
+ (data32~ :initform
+ '(name data32 type xcb:CARD32 size
+ (xcb:-fieldref 'num-items))
+ :type xcb:-list)
+ (data32 :initarg :data32 :type xcb:-ignore)))
+
+(defclass xcb:xinput:XIGetSelectedEvents
+ (xcb:-request)
+ ((~opcode :initform 60 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xinput:XIGetSelectedEvents~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-masks :initarg :num-masks :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (masks~ :initform
+ '(name masks type xcb:xinput:EventMask size
+ (xcb:-fieldref 'num-masks))
+ :type xcb:-list)
+ (masks :initarg :masks :type xcb:-ignore)))
+
+(defclass xcb:xinput:BarrierReleasePointerInfo
+ (xcb:-struct)
+ ((deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (barrier :initarg :barrier :type xcb:xfixes:BARRIER)
+ (eventid :initarg :eventid :type xcb:CARD32)))
+
+(defclass xcb:xinput:XIBarrierReleasePointer
+ (xcb:-request)
+ ((~opcode :initform 61 :type xcb:-u1)
+ (num-barriers :initarg :num-barriers :type xcb:CARD32)
+ (barriers~ :initform
+ '(name barriers type xcb:xinput:BarrierReleasePointerInfo size
+ (xcb:-fieldref 'num-barriers))
+ :type xcb:-list)
+ (barriers :initarg :barriers :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeviceValuator
+ (xcb:-event)
+ ((~code :initform 0)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (device-state :initarg :device-state :type xcb:CARD16)
+ (num-valuators :initarg :num-valuators :type xcb:CARD8)
+ (first-valuator :initarg :first-valuator :type xcb:CARD8)
+ (valuators~ :initform
+ '(name valuators type xcb:INT32 size 6)
+ :type xcb:-list)
+ (valuators :initarg :valuators :type xcb:-ignore)))
+
+(defconst xcb:xinput:MoreEventsMask:MoreEvents 128)
+
+(defclass xcb:xinput:DeviceKeyPress
+ (xcb:-event)
+ ((~code :initform 1)
+ (detail :initarg :detail :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:INT16)
+ (root-y :initarg :root-y :type xcb:INT16)
+ (event-x :initarg :event-x :type xcb:INT16)
+ (event-y :initarg :event-y :type xcb:INT16)
+ (state :initarg :state :type xcb:CARD16)
+ (same-screen :initarg :same-screen :type xcb:BOOL)
+ (device-id :initarg :device-id :type xcb:CARD8)))
+
+(defclass xcb:xinput:DeviceKeyRelease
+ (xcb:xinput:DeviceKeyPress)
+ ((~code :initform 2)))
+
+(defclass xcb:xinput:DeviceButtonPress
+ (xcb:xinput:DeviceKeyPress)
+ ((~code :initform 3)))
+
+(defclass xcb:xinput:DeviceButtonRelease
+ (xcb:xinput:DeviceKeyPress)
+ ((~code :initform 4)))
+
+(defclass xcb:xinput:DeviceMotionNotify
+ (xcb:xinput:DeviceKeyPress)
+ ((~code :initform 5)))
+
+(defclass xcb:xinput:DeviceFocusIn
+ (xcb:-event)
+ ((~code :initform 6)
+ (detail :initarg :detail :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (window :initarg :window :type xcb:WINDOW)
+ (mode :initarg :mode :type xcb:BYTE)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (pad~0 :initform 18 :type xcb:-pad)))
+
+(defclass xcb:xinput:DeviceFocusOut
+ (xcb:xinput:DeviceFocusIn)
+ ((~code :initform 7)))
+
+(defclass xcb:xinput:ProximityIn
+ (xcb:xinput:DeviceKeyPress)
+ ((~code :initform 8)))
+
+(defclass xcb:xinput:ProximityOut
+ (xcb:xinput:DeviceKeyPress)
+ ((~code :initform 9)))
+
+(defconst xcb:xinput:ClassesReportedMask:OutOfProximity 128)
+(defconst xcb:xinput:ClassesReportedMask:DeviceModeAbsolute 64)
+(defconst xcb:xinput:ClassesReportedMask:ReportingValuators 4)
+(defconst xcb:xinput:ClassesReportedMask:ReportingButtons 2)
+(defconst xcb:xinput:ClassesReportedMask:ReportingKeys 1)
+
+(defclass xcb:xinput:DeviceStateNotify
+ (xcb:-event)
+ ((~code :initform 10)
+ (device-id :initarg :device-id :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (num-keys :initarg :num-keys :type xcb:CARD8)
+ (num-buttons :initarg :num-buttons :type xcb:CARD8)
+ (num-valuators :initarg :num-valuators :type xcb:CARD8)
+ (classes-reported :initarg :classes-reported :type xcb:CARD8)
+ (buttons~ :initform
+ '(name buttons type xcb:CARD8 size 4)
+ :type xcb:-list)
+ (buttons :initarg :buttons :type xcb:-ignore)
+ (keys~ :initform
+ '(name keys type xcb:CARD8 size 4)
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)
+ (valuators~ :initform
+ '(name valuators type xcb:CARD32 size 3)
+ :type xcb:-list)
+ (valuators :initarg :valuators :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeviceMappingNotify
+ (xcb:-event)
+ ((~code :initform 11)
+ (device-id :initarg :device-id :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (request :initarg :request :type xcb:CARD8)
+ (first-keycode :initarg :first-keycode :type xcb:xinput:KeyCode)
+ (count :initarg :count :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defconst xcb:xinput:ChangeDevice:NewPointer 0)
+(defconst xcb:xinput:ChangeDevice:NewKeyboard 1)
+
+(defclass xcb:xinput:ChangeDeviceNotify
+ (xcb:-event)
+ ((~code :initform 12)
+ (device-id :initarg :device-id :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (request :initarg :request :type xcb:CARD8)
+ (pad~0 :initform 23 :type xcb:-pad)))
+
+(defclass xcb:xinput:DeviceKeyStateNotify
+ (xcb:-event)
+ ((~code :initform 13)
+ (device-id :initarg :device-id :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (keys~ :initform
+ '(name keys type xcb:CARD8 size 28)
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)))
+
+(defclass xcb:xinput:DeviceButtonStateNotify
+ (xcb:-event)
+ ((~code :initform 14)
+ (device-id :initarg :device-id :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (buttons~ :initform
+ '(name buttons type xcb:CARD8 size 28)
+ :type xcb:-list)
+ (buttons :initarg :buttons :type xcb:-ignore)))
+
+(defconst xcb:xinput:DeviceChange:Added 0)
+(defconst xcb:xinput:DeviceChange:Removed 1)
+(defconst xcb:xinput:DeviceChange:Enabled 2)
+(defconst xcb:xinput:DeviceChange:Disabled 3)
+(defconst xcb:xinput:DeviceChange:Unrecoverable 4)
+(defconst xcb:xinput:DeviceChange:ControlChanged 5)
+
+(defclass xcb:xinput:DevicePresenceNotify
+ (xcb:-event)
+ ((~code :initform 15)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (devchange :initarg :devchange :type xcb:BYTE)
+ (device-id :initarg :device-id :type xcb:BYTE)
+ (control :initarg :control :type xcb:CARD16)
+ (pad~1 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:xinput:DevicePropertyNotify
+ (xcb:-event)
+ ((~code :initform 16)
+ (state :initarg :state :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (property :initarg :property :type xcb:ATOM)
+ (pad~0 :initform 19 :type xcb:-pad)
+ (device-id :initarg :device-id :type xcb:CARD8)))
+
+(defconst xcb:xinput:ChangeReason:SlaveSwitch 1)
+(defconst xcb:xinput:ChangeReason:DeviceChange 2)
+
+(defclass xcb:xinput:DeviceChanged
+ (xcb:-generic-event)
+ ((~evtype :initform 1)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (reason :initarg :reason :type xcb:CARD8)
+ (pad~0 :initform 11 :type xcb:-pad)
+ (classes~ :initform
+ '(name classes type xcb:xinput:DeviceClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defconst xcb:xinput:KeyEventFlags:KeyRepeat 65536)
+
+(defclass xcb:xinput:KeyPress
+ (xcb:-generic-event)
+ ((~evtype :initform 2)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (detail :initarg :detail :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:xinput:FP1616)
+ (root-y :initarg :root-y :type xcb:xinput:FP1616)
+ (event-x :initarg :event-x :type xcb:xinput:FP1616)
+ (event-y :initarg :event-y :type xcb:xinput:FP1616)
+ (buttons-len :initarg :buttons-len :type xcb:CARD16)
+ (valuators-len :initarg :valuators-len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (mods :initarg :mods :type xcb:xinput:ModifierInfo)
+ (group :initarg :group :type xcb:xinput:GroupInfo)
+ (button-mask~ :initform
+ '(name button-mask type xcb:CARD32 size
+ (xcb:-fieldref 'buttons-len))
+ :type xcb:-list)
+ (button-mask :initarg :button-mask :type xcb:-ignore)
+ (valuator-mask~ :initform
+ '(name valuator-mask type xcb:CARD32 size
+ (xcb:-fieldref 'valuators-len))
+ :type xcb:-list)
+ (valuator-mask :initarg :valuator-mask :type xcb:-ignore)
+ (axisvalues~ :initform
+ '(name axisvalues type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues :initarg :axisvalues :type xcb:-ignore)))
+
+(defclass xcb:xinput:KeyRelease
+ (xcb:xinput:KeyPress)
+ ((~evtype :initform 3)))
+
+(defconst xcb:xinput:PointerEventFlags:PointerEmulated 65536)
+
+(defclass xcb:xinput:ButtonPress
+ (xcb:-generic-event)
+ ((~evtype :initform 4)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (detail :initarg :detail :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:xinput:FP1616)
+ (root-y :initarg :root-y :type xcb:xinput:FP1616)
+ (event-x :initarg :event-x :type xcb:xinput:FP1616)
+ (event-y :initarg :event-y :type xcb:xinput:FP1616)
+ (buttons-len :initarg :buttons-len :type xcb:CARD16)
+ (valuators-len :initarg :valuators-len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (mods :initarg :mods :type xcb:xinput:ModifierInfo)
+ (group :initarg :group :type xcb:xinput:GroupInfo)
+ (button-mask~ :initform
+ '(name button-mask type xcb:CARD32 size
+ (xcb:-fieldref 'buttons-len))
+ :type xcb:-list)
+ (button-mask :initarg :button-mask :type xcb:-ignore)
+ (valuator-mask~ :initform
+ '(name valuator-mask type xcb:CARD32 size
+ (xcb:-fieldref 'valuators-len))
+ :type xcb:-list)
+ (valuator-mask :initarg :valuator-mask :type xcb:-ignore)
+ (axisvalues~ :initform
+ '(name axisvalues type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues :initarg :axisvalues :type xcb:-ignore)))
+
+(defclass xcb:xinput:ButtonRelease
+ (xcb:xinput:ButtonPress)
+ ((~evtype :initform 5)))
+
+(defclass xcb:xinput:Motion
+ (xcb:xinput:ButtonPress)
+ ((~evtype :initform 6)))
+
+(defconst xcb:xinput:NotifyMode:Normal 0)
+(defconst xcb:xinput:NotifyMode:Grab 1)
+(defconst xcb:xinput:NotifyMode:Ungrab 2)
+(defconst xcb:xinput:NotifyMode:WhileGrabbed 3)
+(defconst xcb:xinput:NotifyMode:PassiveGrab 4)
+(defconst xcb:xinput:NotifyMode:PassiveUngrab 5)
+
+(defconst xcb:xinput:NotifyDetail:Ancestor 0)
+(defconst xcb:xinput:NotifyDetail:Virtual 1)
+(defconst xcb:xinput:NotifyDetail:Inferior 2)
+(defconst xcb:xinput:NotifyDetail:Nonlinear 3)
+(defconst xcb:xinput:NotifyDetail:NonlinearVirtual 4)
+(defconst xcb:xinput:NotifyDetail:Pointer 5)
+(defconst xcb:xinput:NotifyDetail:PointerRoot 6)
+(defconst xcb:xinput:NotifyDetail:None 7)
+
+(defclass xcb:xinput:Enter
+ (xcb:-generic-event)
+ ((~evtype :initform 7)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (mode :initarg :mode :type xcb:CARD8)
+ (detail :initarg :detail :type xcb:CARD8)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:xinput:FP1616)
+ (root-y :initarg :root-y :type xcb:xinput:FP1616)
+ (event-x :initarg :event-x :type xcb:xinput:FP1616)
+ (event-y :initarg :event-y :type xcb:xinput:FP1616)
+ (same-screen :initarg :same-screen :type xcb:BOOL)
+ (focus :initarg :focus :type xcb:BOOL)
+ (buttons-len :initarg :buttons-len :type xcb:CARD16)
+ (mods :initarg :mods :type xcb:xinput:ModifierInfo)
+ (group :initarg :group :type xcb:xinput:GroupInfo)
+ (buttons~ :initform
+ '(name buttons type xcb:CARD32 size
+ (xcb:-fieldref 'buttons-len))
+ :type xcb:-list)
+ (buttons :initarg :buttons :type xcb:-ignore)))
+
+(defclass xcb:xinput:Leave
+ (xcb:xinput:Enter)
+ ((~evtype :initform 8)))
+
+(defclass xcb:xinput:FocusIn
+ (xcb:xinput:Enter)
+ ((~evtype :initform 9)))
+
+(defclass xcb:xinput:FocusOut
+ (xcb:xinput:Enter)
+ ((~evtype :initform 10)))
+
+(defconst xcb:xinput:HierarchyMask:MasterAdded 1)
+(defconst xcb:xinput:HierarchyMask:MasterRemoved 2)
+(defconst xcb:xinput:HierarchyMask:SlaveAdded 4)
+(defconst xcb:xinput:HierarchyMask:SlaveRemoved 8)
+(defconst xcb:xinput:HierarchyMask:SlaveAttached 16)
+(defconst xcb:xinput:HierarchyMask:SlaveDetached 32)
+(defconst xcb:xinput:HierarchyMask:DeviceEnabled 64)
+(defconst xcb:xinput:HierarchyMask:DeviceDisabled 128)
+
+(defclass xcb:xinput:HierarchyInfo
+ (xcb:-struct)
+ ((deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (attachment :initarg :attachment :type xcb:xinput:DeviceId)
+ (type :initarg :type :type xcb:CARD8)
+ (enabled :initarg :enabled :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)))
+
+(defclass xcb:xinput:Hierarchy
+ (xcb:-generic-event)
+ ((~evtype :initform 11)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (flags :initarg :flags :type xcb:CARD32)
+ (num-infos :initarg :num-infos :type xcb:CARD16)
+ (pad~0 :initform 10 :type xcb:-pad)
+ (infos~ :initform
+ '(name infos type xcb:xinput:HierarchyInfo size
+ (xcb:-fieldref 'num-infos))
+ :type xcb:-list)
+ (infos :initarg :infos :type xcb:-ignore)))
+
+(defconst xcb:xinput:PropertyFlag:Deleted 0)
+(defconst xcb:xinput:PropertyFlag:Created 1)
+(defconst xcb:xinput:PropertyFlag:Modified 2)
+
+(defclass xcb:xinput:Property
+ (xcb:-generic-event)
+ ((~evtype :initform 12)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (property :initarg :property :type xcb:ATOM)
+ (what :initarg :what :type xcb:CARD8)
+ (pad~0 :initform 11 :type xcb:-pad)))
+
+(defclass xcb:xinput:RawKeyPress
+ (xcb:-generic-event)
+ ((~evtype :initform 13)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (detail :initarg :detail :type xcb:CARD32)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (valuators-len :initarg :valuators-len :type xcb:CARD16)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~0 :initform 4 :type xcb:-pad)
+ (valuator-mask~ :initform
+ '(name valuator-mask type xcb:CARD32 size
+ (xcb:-fieldref 'valuators-len))
+ :type xcb:-list)
+ (valuator-mask :initarg :valuator-mask :type xcb:-ignore)
+ (axisvalues~ :initform
+ '(name axisvalues type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues :initarg :axisvalues :type xcb:-ignore)
+ (axisvalues-raw~ :initform
+ '(name axisvalues-raw type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues-raw :initarg :axisvalues-raw :type xcb:-ignore)))
+
+(defclass xcb:xinput:RawKeyRelease
+ (xcb:xinput:RawKeyPress)
+ ((~evtype :initform 14)))
+
+(defclass xcb:xinput:RawButtonPress
+ (xcb:-generic-event)
+ ((~evtype :initform 15)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (detail :initarg :detail :type xcb:CARD32)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (valuators-len :initarg :valuators-len :type xcb:CARD16)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~0 :initform 4 :type xcb:-pad)
+ (valuator-mask~ :initform
+ '(name valuator-mask type xcb:CARD32 size
+ (xcb:-fieldref 'valuators-len))
+ :type xcb:-list)
+ (valuator-mask :initarg :valuator-mask :type xcb:-ignore)
+ (axisvalues~ :initform
+ '(name axisvalues type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues :initarg :axisvalues :type xcb:-ignore)
+ (axisvalues-raw~ :initform
+ '(name axisvalues-raw type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues-raw :initarg :axisvalues-raw :type xcb:-ignore)))
+
+(defclass xcb:xinput:RawButtonRelease
+ (xcb:xinput:RawButtonPress)
+ ((~evtype :initform 16)))
+
+(defclass xcb:xinput:RawMotion
+ (xcb:xinput:RawButtonPress)
+ ((~evtype :initform 17)))
+
+(defconst xcb:xinput:TouchEventFlags:TouchPendingEnd 65536)
+(defconst xcb:xinput:TouchEventFlags:TouchEmulatingPointer 131072)
+
+(defclass xcb:xinput:TouchBegin
+ (xcb:-generic-event)
+ ((~evtype :initform 18)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (detail :initarg :detail :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:xinput:FP1616)
+ (root-y :initarg :root-y :type xcb:xinput:FP1616)
+ (event-x :initarg :event-x :type xcb:xinput:FP1616)
+ (event-y :initarg :event-y :type xcb:xinput:FP1616)
+ (buttons-len :initarg :buttons-len :type xcb:CARD16)
+ (valuators-len :initarg :valuators-len :type xcb:CARD16)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (mods :initarg :mods :type xcb:xinput:ModifierInfo)
+ (group :initarg :group :type xcb:xinput:GroupInfo)
+ (button-mask~ :initform
+ '(name button-mask type xcb:CARD32 size
+ (xcb:-fieldref 'buttons-len))
+ :type xcb:-list)
+ (button-mask :initarg :button-mask :type xcb:-ignore)
+ (valuator-mask~ :initform
+ '(name valuator-mask type xcb:CARD32 size
+ (xcb:-fieldref 'valuators-len))
+ :type xcb:-list)
+ (valuator-mask :initarg :valuator-mask :type xcb:-ignore)
+ (axisvalues~ :initform
+ '(name axisvalues type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues :initarg :axisvalues :type xcb:-ignore)))
+
+(defclass xcb:xinput:TouchUpdate
+ (xcb:xinput:TouchBegin)
+ ((~evtype :initform 19)))
+
+(defclass xcb:xinput:TouchEnd
+ (xcb:xinput:TouchBegin)
+ ((~evtype :initform 20)))
+
+(defconst xcb:xinput:TouchOwnershipFlags:None 0)
+
+(defclass xcb:xinput:TouchOwnership
+ (xcb:-generic-event)
+ ((~evtype :initform 21)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (touchid :initarg :touchid :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)))
+
+(defclass xcb:xinput:RawTouchBegin
+ (xcb:-generic-event)
+ ((~evtype :initform 22)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (detail :initarg :detail :type xcb:CARD32)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (valuators-len :initarg :valuators-len :type xcb:CARD16)
+ (flags :initarg :flags :type xcb:CARD32)
+ (pad~0 :initform 4 :type xcb:-pad)
+ (valuator-mask~ :initform
+ '(name valuator-mask type xcb:CARD32 size
+ (xcb:-fieldref 'valuators-len))
+ :type xcb:-list)
+ (valuator-mask :initarg :valuator-mask :type xcb:-ignore)
+ (axisvalues~ :initform
+ '(name axisvalues type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues :initarg :axisvalues :type xcb:-ignore)
+ (axisvalues-raw~ :initform
+ '(name axisvalues-raw type xcb:xinput:FP3232 size
+ (apply #'+
+ (mapcar
+ (lambda
+ (i)
+ (eval
+ '(logcount obj)
+ (list
+ (nconc
+ '(obj)
+ i))))
+ (slot-value obj 'valuator-mask))))
+ :type xcb:-list)
+ (axisvalues-raw :initarg :axisvalues-raw :type xcb:-ignore)))
+
+(defclass xcb:xinput:RawTouchUpdate
+ (xcb:xinput:RawTouchBegin)
+ ((~evtype :initform 23)))
+
+(defclass xcb:xinput:RawTouchEnd
+ (xcb:xinput:RawTouchBegin)
+ ((~evtype :initform 24)))
+
+(defconst xcb:xinput:BarrierFlags:PointerReleased 1)
+(defconst xcb:xinput:BarrierFlags:DeviceIsGrabbed 2)
+
+(defclass xcb:xinput:BarrierHit
+ (xcb:-generic-event)
+ ((~evtype :initform 25)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (eventid :initarg :eventid :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (barrier :initarg :barrier :type xcb:xfixes:BARRIER)
+ (dtime :initarg :dtime :type xcb:CARD32)
+ (flags :initarg :flags :type xcb:CARD32)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (root-x :initarg :root-x :type xcb:xinput:FP1616)
+ (root-y :initarg :root-y :type xcb:xinput:FP1616)
+ (dx :initarg :dx :type xcb:xinput:FP3232)
+ (dy :initarg :dy :type xcb:xinput:FP3232)))
+
+(defclass xcb:xinput:BarrierLeave
+ (xcb:xinput:BarrierHit)
+ ((~evtype :initform 26)))
+
+(defconst xcb:xinput:GesturePinchEventFlags:GesturePinchCancelled 1)
+
+(defclass xcb:xinput:GesturePinchBegin
+ (xcb:-generic-event)
+ ((~evtype :initform 27)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (detail :initarg :detail :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:xinput:FP1616)
+ (root-y :initarg :root-y :type xcb:xinput:FP1616)
+ (event-x :initarg :event-x :type xcb:xinput:FP1616)
+ (event-y :initarg :event-y :type xcb:xinput:FP1616)
+ (delta-x :initarg :delta-x :type xcb:xinput:FP1616)
+ (delta-y :initarg :delta-y :type xcb:xinput:FP1616)
+ (delta-unaccel-x :initarg :delta-unaccel-x :type xcb:xinput:FP1616)
+ (delta-unaccel-y :initarg :delta-unaccel-y :type xcb:xinput:FP1616)
+ (scale :initarg :scale :type xcb:xinput:FP1616)
+ (delta-angle :initarg :delta-angle :type xcb:xinput:FP1616)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (mods :initarg :mods :type xcb:xinput:ModifierInfo)
+ (group :initarg :group :type xcb:xinput:GroupInfo)
+ (flags :initarg :flags :type xcb:CARD32)))
+
+(defclass xcb:xinput:GesturePinchUpdate
+ (xcb:xinput:GesturePinchBegin)
+ ((~evtype :initform 28)))
+
+(defclass xcb:xinput:GesturePinchEnd
+ (xcb:xinput:GesturePinchBegin)
+ ((~evtype :initform 29)))
+
+(defconst xcb:xinput:GestureSwipeEventFlags:GestureSwipeCancelled 1)
+
+(defclass xcb:xinput:GestureSwipeBegin
+ (xcb:-generic-event)
+ ((~evtype :initform 30)
+ (deviceid :initarg :deviceid :type xcb:xinput:DeviceId)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (detail :initarg :detail :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:xinput:FP1616)
+ (root-y :initarg :root-y :type xcb:xinput:FP1616)
+ (event-x :initarg :event-x :type xcb:xinput:FP1616)
+ (event-y :initarg :event-y :type xcb:xinput:FP1616)
+ (delta-x :initarg :delta-x :type xcb:xinput:FP1616)
+ (delta-y :initarg :delta-y :type xcb:xinput:FP1616)
+ (delta-unaccel-x :initarg :delta-unaccel-x :type xcb:xinput:FP1616)
+ (delta-unaccel-y :initarg :delta-unaccel-y :type xcb:xinput:FP1616)
+ (sourceid :initarg :sourceid :type xcb:xinput:DeviceId)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (mods :initarg :mods :type xcb:xinput:ModifierInfo)
+ (group :initarg :group :type xcb:xinput:GroupInfo)
+ (flags :initarg :flags :type xcb:CARD32)))
+
+(defclass xcb:xinput:GestureSwipeUpdate
+ (xcb:xinput:GestureSwipeBegin)
+ ((~evtype :initform 31)))
+
+(defclass xcb:xinput:GestureSwipeEnd
+ (xcb:xinput:GestureSwipeBegin)
+ ((~evtype :initform 32)))
+
+(defclass xcb:xinput:EventForSend
+ (xcb:-event)
+ nil)
+
+(defclass xcb:xinput:SendExtensionEvent
+ (xcb:-request)
+ ((~opcode :initform 31 :type xcb:-u1)
+ (destination :initarg :destination :type xcb:WINDOW)
+ (device-id :initarg :device-id :type xcb:CARD8)
+ (propagate :initarg :propagate :type xcb:BOOL)
+ (num-classes :initarg :num-classes :type xcb:CARD16)
+ (num-events :initarg :num-events :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (events~ :initform
+ '(name events type xcb:xinput:EventForSend size
+ (xcb:-fieldref 'num-events))
+ :type xcb:-list)
+ (events :initarg :events :type xcb:-ignore)
+ (classes~ :initform
+ '(name classes type xcb:xinput:EventClass size
+ (xcb:-fieldref 'num-classes))
+ :type xcb:-list)
+ (classes :initarg :classes :type xcb:-ignore)))
+
+(defclass xcb:xinput:Device
+ (xcb:-error)
+ ((~code :initform 0)))
+
+(defclass xcb:xinput:Event
+ (xcb:-error)
+ ((~code :initform 1)))
+
+(defclass xcb:xinput:Mode
+ (xcb:-error)
+ ((~code :initform 2)))
+
+(defclass xcb:xinput:DeviceBusy
+ (xcb:-error)
+ ((~code :initform 3)))
+
+(defclass xcb:xinput:Class
+ (xcb:-error)
+ ((~code :initform 4)))
+
+(defconst xcb:xinput:error-number-class-alist
+ '((0 . xcb:xinput:Device)
+ (1 . xcb:xinput:Event)
+ (2 . xcb:xinput:Mode)
+ (3 . xcb:xinput:DeviceBusy)
+ (4 . xcb:xinput:Class))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:xinput:event-number-class-alist
+ '((0 . xcb:xinput:DeviceValuator)
+ (1 . xcb:xinput:DeviceKeyPress)
+ (2 . xcb:xinput:DeviceKeyRelease)
+ (3 . xcb:xinput:DeviceButtonPress)
+ (4 . xcb:xinput:DeviceButtonRelease)
+ (5 . xcb:xinput:DeviceMotionNotify)
+ (6 . xcb:xinput:DeviceFocusIn)
+ (7 . xcb:xinput:DeviceFocusOut)
+ (8 . xcb:xinput:ProximityIn)
+ (9 . xcb:xinput:ProximityOut)
+ (10 . xcb:xinput:DeviceStateNotify)
+ (11 . xcb:xinput:DeviceMappingNotify)
+ (12 . xcb:xinput:ChangeDeviceNotify)
+ (13 . xcb:xinput:DeviceKeyStateNotify)
+ (14 . xcb:xinput:DeviceButtonStateNotify)
+ (15 . xcb:xinput:DevicePresenceNotify)
+ (16 . xcb:xinput:DevicePropertyNotify))
+ "(event-number . event-class) alist.")
+
+(defconst xcb:xinput:xge-number-class-alist
+ '((1 . xcb:xinput:DeviceChanged)
+ (2 . xcb:xinput:KeyPress)
+ (3 . xcb:xinput:KeyRelease)
+ (4 . xcb:xinput:ButtonPress)
+ (5 . xcb:xinput:ButtonRelease)
+ (6 . xcb:xinput:Motion)
+ (7 . xcb:xinput:Enter)
+ (8 . xcb:xinput:Leave)
+ (9 . xcb:xinput:FocusIn)
+ (10 . xcb:xinput:FocusOut)
+ (11 . xcb:xinput:Hierarchy)
+ (12 . xcb:xinput:Property)
+ (13 . xcb:xinput:RawKeyPress)
+ (14 . xcb:xinput:RawKeyRelease)
+ (15 . xcb:xinput:RawButtonPress)
+ (16 . xcb:xinput:RawButtonRelease)
+ (17 . xcb:xinput:RawMotion)
+ (18 . xcb:xinput:TouchBegin)
+ (19 . xcb:xinput:TouchUpdate)
+ (20 . xcb:xinput:TouchEnd)
+ (21 . xcb:xinput:TouchOwnership)
+ (22 . xcb:xinput:RawTouchBegin)
+ (23 . xcb:xinput:RawTouchUpdate)
+ (24 . xcb:xinput:RawTouchEnd)
+ (25 . xcb:xinput:BarrierHit)
+ (26 . xcb:xinput:BarrierLeave)
+ (27 . xcb:xinput:GesturePinchBegin)
+ (28 . xcb:xinput:GesturePinchUpdate)
+ (29 . xcb:xinput:GesturePinchEnd)
+ (30 . xcb:xinput:GestureSwipeBegin)
+ (31 . xcb:xinput:GestureSwipeUpdate)
+ (32 . xcb:xinput:GestureSwipeEnd))
+ "(xge-number . event-class) alist.")
+
+
+
+(provide 'xcb-xinput)
+
+;;; xcb-xinput.el ends here
diff --git a/elpa/xelb-0.20/xcb-xinput.elc b/elpa/xelb-0.20/xcb-xinput.elc
new file mode 100644
index 0000000..fc95d81
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xinput.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xkb.el b/elpa/xelb-0.20/xcb-xkb.el
new file mode 100644
index 0000000..5f20c43
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xkb.el
@@ -0,0 +1,2315 @@
+;;; xcb-xkb.el --- X11 xkb extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xkb.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xkb:-extension-xname "XKEYBOARD")
+(defconst xcb:xkb:-extension-name "xkb")
+(defconst xcb:xkb:-major-version 1)
+(defconst xcb:xkb:-minor-version 0)
+
+(require 'xcb-xproto)
+
+(defconst xcb:xkb:Const:MaxLegalKeyCode 255)
+(defconst xcb:xkb:Const:PerKeyBitArraySize 32)
+(defconst xcb:xkb:Const:KeyNameLength 4)
+
+(defconst xcb:xkb:EventType:NewKeyboardNotify 1)
+(defconst xcb:xkb:EventType:MapNotify 2)
+(defconst xcb:xkb:EventType:StateNotify 4)
+(defconst xcb:xkb:EventType:ControlsNotify 8)
+(defconst xcb:xkb:EventType:IndicatorStateNotify 16)
+(defconst xcb:xkb:EventType:IndicatorMapNotify 32)
+(defconst xcb:xkb:EventType:NamesNotify 64)
+(defconst xcb:xkb:EventType:CompatMapNotify 128)
+(defconst xcb:xkb:EventType:BellNotify 256)
+(defconst xcb:xkb:EventType:ActionMessage 512)
+(defconst xcb:xkb:EventType:AccessXNotify 1024)
+(defconst xcb:xkb:EventType:ExtensionDeviceNotify 2048)
+
+(defconst xcb:xkb:NKNDetail:Keycodes 1)
+(defconst xcb:xkb:NKNDetail:Geometry 2)
+(defconst xcb:xkb:NKNDetail:DeviceID 4)
+
+(defconst xcb:xkb:AXNDetail:SKPress 1)
+(defconst xcb:xkb:AXNDetail:SKAccept 2)
+(defconst xcb:xkb:AXNDetail:SKReject 4)
+(defconst xcb:xkb:AXNDetail:SKRelease 8)
+(defconst xcb:xkb:AXNDetail:BKAccept 16)
+(defconst xcb:xkb:AXNDetail:BKReject 32)
+(defconst xcb:xkb:AXNDetail:AXKWarning 64)
+
+(defconst xcb:xkb:MapPart:KeyTypes 1)
+(defconst xcb:xkb:MapPart:KeySyms 2)
+(defconst xcb:xkb:MapPart:ModifierMap 4)
+(defconst xcb:xkb:MapPart:ExplicitComponents 8)
+(defconst xcb:xkb:MapPart:KeyActions 16)
+(defconst xcb:xkb:MapPart:KeyBehaviors 32)
+(defconst xcb:xkb:MapPart:VirtualMods 64)
+(defconst xcb:xkb:MapPart:VirtualModMap 128)
+
+(defconst xcb:xkb:SetMapFlags:ResizeTypes 1)
+(defconst xcb:xkb:SetMapFlags:RecomputeActions 2)
+
+(defconst xcb:xkb:StatePart:ModifierState 1)
+(defconst xcb:xkb:StatePart:ModifierBase 2)
+(defconst xcb:xkb:StatePart:ModifierLatch 4)
+(defconst xcb:xkb:StatePart:ModifierLock 8)
+(defconst xcb:xkb:StatePart:GroupState 16)
+(defconst xcb:xkb:StatePart:GroupBase 32)
+(defconst xcb:xkb:StatePart:GroupLatch 64)
+(defconst xcb:xkb:StatePart:GroupLock 128)
+(defconst xcb:xkb:StatePart:CompatState 256)
+(defconst xcb:xkb:StatePart:GrabMods 512)
+(defconst xcb:xkb:StatePart:CompatGrabMods 1024)
+(defconst xcb:xkb:StatePart:LookupMods 2048)
+(defconst xcb:xkb:StatePart:CompatLookupMods 4096)
+(defconst xcb:xkb:StatePart:PointerButtons 8192)
+
+(defconst xcb:xkb:BoolCtrl:RepeatKeys 1)
+(defconst xcb:xkb:BoolCtrl:SlowKeys 2)
+(defconst xcb:xkb:BoolCtrl:BounceKeys 4)
+(defconst xcb:xkb:BoolCtrl:StickyKeys 8)
+(defconst xcb:xkb:BoolCtrl:MouseKeys 16)
+(defconst xcb:xkb:BoolCtrl:MouseKeysAccel 32)
+(defconst xcb:xkb:BoolCtrl:AccessXKeys 64)
+(defconst xcb:xkb:BoolCtrl:AccessXTimeoutMask 128)
+(defconst xcb:xkb:BoolCtrl:AccessXFeedbackMask 256)
+(defconst xcb:xkb:BoolCtrl:AudibleBellMask 512)
+(defconst xcb:xkb:BoolCtrl:Overlay1Mask 1024)
+(defconst xcb:xkb:BoolCtrl:Overlay2Mask 2048)
+(defconst xcb:xkb:BoolCtrl:IgnoreGroupLockMask 4096)
+
+(defconst xcb:xkb:Control:GroupsWrap 134217728)
+(defconst xcb:xkb:Control:InternalMods 268435456)
+
+(defconst xcb:xkb:AXOption:SKPressFB 1)
+(defconst xcb:xkb:AXOption:SKAcceptFB 2)
+(defconst xcb:xkb:AXOption:FeatureFB 4)
+(defconst xcb:xkb:AXOption:SlowWarnFB 8)
+(defconst xcb:xkb:AXOption:IndicatorFB 16)
+(defconst xcb:xkb:AXOption:StickyKeysFB 32)
+(defconst xcb:xkb:AXOption:TwoKeys 64)
+(defconst xcb:xkb:AXOption:LatchToLock 128)
+(defconst xcb:xkb:AXOption:SKReleaseFB 256)
+(defconst xcb:xkb:AXOption:SKRejectFB 512)
+(defconst xcb:xkb:AXOption:BKRejectFB 1024)
+(defconst xcb:xkb:AXOption:DumbBell 2048)
+
+(xcb:deftypealias 'xcb:xkb:DeviceSpec 'xcb:CARD16)
+
+(defconst xcb:xkb:LedClassResult:KbdFeedbackClass 0)
+(defconst xcb:xkb:LedClassResult:LedFeedbackClass 4)
+
+(defconst xcb:xkb:LedClass:KbdFeedbackClass 0)
+(defconst xcb:xkb:LedClass:LedFeedbackClass 4)
+(defconst xcb:xkb:LedClass:DfltXIClass 768)
+(defconst xcb:xkb:LedClass:AllXIClasses 1280)
+
+(xcb:deftypealias 'xcb:xkb:LedClassSpec 'xcb:CARD16)
+
+(defconst xcb:xkb:BellClassResult:KbdFeedbackClass 0)
+(defconst xcb:xkb:BellClassResult:BellFeedbackClass 5)
+
+(defconst xcb:xkb:BellClass:KbdFeedbackClass 0)
+(defconst xcb:xkb:BellClass:BellFeedbackClass 5)
+(defconst xcb:xkb:BellClass:DfltXIClass 768)
+
+(xcb:deftypealias 'xcb:xkb:BellClassSpec 'xcb:CARD16)
+
+(defconst xcb:xkb:ID:UseCoreKbd 256)
+(defconst xcb:xkb:ID:UseCorePtr 512)
+(defconst xcb:xkb:ID:DfltXIClass 768)
+(defconst xcb:xkb:ID:DfltXIId 1024)
+(defconst xcb:xkb:ID:AllXIClass 1280)
+(defconst xcb:xkb:ID:AllXIId 1536)
+(defconst xcb:xkb:ID:XINone 65280)
+
+(xcb:deftypealias 'xcb:xkb:IDSpec 'xcb:CARD16)
+
+(defconst xcb:xkb:Group:1 0)
+(defconst xcb:xkb:Group:2 1)
+(defconst xcb:xkb:Group:3 2)
+(defconst xcb:xkb:Group:4 3)
+
+(defconst xcb:xkb:Groups:Any 254)
+(defconst xcb:xkb:Groups:All 255)
+
+(defconst xcb:xkb:SetOfGroup:Group1 1)
+(defconst xcb:xkb:SetOfGroup:Group2 2)
+(defconst xcb:xkb:SetOfGroup:Group3 4)
+(defconst xcb:xkb:SetOfGroup:Group4 8)
+
+(defconst xcb:xkb:SetOfGroups:Any 128)
+
+(defconst xcb:xkb:GroupsWrap:WrapIntoRange 0)
+(defconst xcb:xkb:GroupsWrap:ClampIntoRange 64)
+(defconst xcb:xkb:GroupsWrap:RedirectIntoRange 128)
+
+(defconst xcb:xkb:VModsHigh:15 128)
+(defconst xcb:xkb:VModsHigh:14 64)
+(defconst xcb:xkb:VModsHigh:13 32)
+(defconst xcb:xkb:VModsHigh:12 16)
+(defconst xcb:xkb:VModsHigh:11 8)
+(defconst xcb:xkb:VModsHigh:10 4)
+(defconst xcb:xkb:VModsHigh:9 2)
+(defconst xcb:xkb:VModsHigh:8 1)
+
+(defconst xcb:xkb:VModsLow:7 128)
+(defconst xcb:xkb:VModsLow:6 64)
+(defconst xcb:xkb:VModsLow:5 32)
+(defconst xcb:xkb:VModsLow:4 16)
+(defconst xcb:xkb:VModsLow:3 8)
+(defconst xcb:xkb:VModsLow:2 4)
+(defconst xcb:xkb:VModsLow:1 2)
+(defconst xcb:xkb:VModsLow:0 1)
+
+(defconst xcb:xkb:VMod:15 32768)
+(defconst xcb:xkb:VMod:14 16384)
+(defconst xcb:xkb:VMod:13 8192)
+(defconst xcb:xkb:VMod:12 4096)
+(defconst xcb:xkb:VMod:11 2048)
+(defconst xcb:xkb:VMod:10 1024)
+(defconst xcb:xkb:VMod:9 512)
+(defconst xcb:xkb:VMod:8 256)
+(defconst xcb:xkb:VMod:7 128)
+(defconst xcb:xkb:VMod:6 64)
+(defconst xcb:xkb:VMod:5 32)
+(defconst xcb:xkb:VMod:4 16)
+(defconst xcb:xkb:VMod:3 8)
+(defconst xcb:xkb:VMod:2 4)
+(defconst xcb:xkb:VMod:1 2)
+(defconst xcb:xkb:VMod:0 1)
+
+(defconst xcb:xkb:Explicit:VModMap 128)
+(defconst xcb:xkb:Explicit:Behavior 64)
+(defconst xcb:xkb:Explicit:AutoRepeat 32)
+(defconst xcb:xkb:Explicit:Interpret 16)
+(defconst xcb:xkb:Explicit:KeyType4 8)
+(defconst xcb:xkb:Explicit:KeyType3 4)
+(defconst xcb:xkb:Explicit:KeyType2 2)
+(defconst xcb:xkb:Explicit:KeyType1 1)
+
+(defconst xcb:xkb:SymInterpretMatch:NoneOf 0)
+(defconst xcb:xkb:SymInterpretMatch:AnyOfOrNone 1)
+(defconst xcb:xkb:SymInterpretMatch:AnyOf 2)
+(defconst xcb:xkb:SymInterpretMatch:AllOf 3)
+(defconst xcb:xkb:SymInterpretMatch:Exactly 4)
+
+(defconst xcb:xkb:SymInterpMatch:LevelOneOnly 128)
+(defconst xcb:xkb:SymInterpMatch:OpMask 127)
+
+(defconst xcb:xkb:IMFlag:NoExplicit 128)
+(defconst xcb:xkb:IMFlag:NoAutomatic 64)
+(defconst xcb:xkb:IMFlag:LEDDrivesKB 32)
+
+(defconst xcb:xkb:IMModsWhich:UseCompat 16)
+(defconst xcb:xkb:IMModsWhich:UseEffective 8)
+(defconst xcb:xkb:IMModsWhich:UseLocked 4)
+(defconst xcb:xkb:IMModsWhich:UseLatched 2)
+(defconst xcb:xkb:IMModsWhich:UseBase 1)
+
+(defconst xcb:xkb:IMGroupsWhich:UseCompat 16)
+(defconst xcb:xkb:IMGroupsWhich:UseEffective 8)
+(defconst xcb:xkb:IMGroupsWhich:UseLocked 4)
+(defconst xcb:xkb:IMGroupsWhich:UseLatched 2)
+(defconst xcb:xkb:IMGroupsWhich:UseBase 1)
+
+(defclass xcb:xkb:IndicatorMap
+ (xcb:-struct)
+ ((flags :initarg :flags :type xcb:CARD8)
+ (whichGroups :initarg :whichGroups :type xcb:CARD8)
+ (groups :initarg :groups :type xcb:CARD8)
+ (whichMods :initarg :whichMods :type xcb:CARD8)
+ (mods :initarg :mods :type xcb:CARD8)
+ (realMods :initarg :realMods :type xcb:CARD8)
+ (vmods :initarg :vmods :type xcb:CARD16)
+ (ctrls :initarg :ctrls :type xcb:CARD32)))
+
+(defconst xcb:xkb:CMDetail:SymInterp 1)
+(defconst xcb:xkb:CMDetail:GroupCompat 2)
+
+(defconst xcb:xkb:NameDetail:Keycodes 1)
+(defconst xcb:xkb:NameDetail:Geometry 2)
+(defconst xcb:xkb:NameDetail:Symbols 4)
+(defconst xcb:xkb:NameDetail:PhysSymbols 8)
+(defconst xcb:xkb:NameDetail:Types 16)
+(defconst xcb:xkb:NameDetail:Compat 32)
+(defconst xcb:xkb:NameDetail:KeyTypeNames 64)
+(defconst xcb:xkb:NameDetail:KTLevelNames 128)
+(defconst xcb:xkb:NameDetail:IndicatorNames 256)
+(defconst xcb:xkb:NameDetail:KeyNames 512)
+(defconst xcb:xkb:NameDetail:KeyAliases 1024)
+(defconst xcb:xkb:NameDetail:VirtualModNames 2048)
+(defconst xcb:xkb:NameDetail:GroupNames 4096)
+(defconst xcb:xkb:NameDetail:RGNames 8192)
+
+(defconst xcb:xkb:GBNDetail:Types 1)
+(defconst xcb:xkb:GBNDetail:CompatMap 2)
+(defconst xcb:xkb:GBNDetail:ClientSymbols 4)
+(defconst xcb:xkb:GBNDetail:ServerSymbols 8)
+(defconst xcb:xkb:GBNDetail:IndicatorMaps 16)
+(defconst xcb:xkb:GBNDetail:KeyNames 32)
+(defconst xcb:xkb:GBNDetail:Geometry 64)
+(defconst xcb:xkb:GBNDetail:OtherNames 128)
+
+(defconst xcb:xkb:XIFeature:Keyboards 1)
+(defconst xcb:xkb:XIFeature:ButtonActions 2)
+(defconst xcb:xkb:XIFeature:IndicatorNames 4)
+(defconst xcb:xkb:XIFeature:IndicatorMaps 8)
+(defconst xcb:xkb:XIFeature:IndicatorState 16)
+
+(defconst xcb:xkb:PerClientFlag:DetectableAutoRepeat 1)
+(defconst xcb:xkb:PerClientFlag:GrabsUseXKBState 2)
+(defconst xcb:xkb:PerClientFlag:AutoResetControls 4)
+(defconst xcb:xkb:PerClientFlag:LookupStateWhenGrabbed 8)
+(defconst xcb:xkb:PerClientFlag:SendEventUsesXKBState 16)
+
+(defclass xcb:xkb:ModDef
+ (xcb:-struct)
+ ((mask :initarg :mask :type xcb:CARD8)
+ (realMods :initarg :realMods :type xcb:CARD8)
+ (vmods :initarg :vmods :type xcb:CARD16)))
+
+(defclass xcb:xkb:KeyName
+ (xcb:-struct)
+ ((name~ :initform
+ '(name name type xcb:char size 4)
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:xkb:KeyAlias
+ (xcb:-struct)
+ ((real~ :initform
+ '(name real type xcb:char size 4)
+ :type xcb:-list)
+ (real :initarg :real :type xcb:-ignore)
+ (alias~ :initform
+ '(name alias type xcb:char size 4)
+ :type xcb:-list)
+ (alias :initarg :alias :type xcb:-ignore)))
+
+(defclass xcb:xkb:CountedString16
+ (xcb:-struct)
+ ((length :initarg :length :type xcb:CARD16)
+ (string~ :initform
+ '(name string type xcb:char size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)
+ (alignment-pad~ :initform
+ '(name alignment-pad type xcb:void size
+ (-
+ (logand
+ (+
+ (xcb:-fieldref 'length)
+ 5)
+ (lognot 3))
+ (+
+ (xcb:-fieldref 'length)
+ 2)))
+ :type xcb:-list)
+ (alignment-pad :initarg :alignment-pad :type xcb:-ignore)))
+
+(defclass xcb:xkb:KTMapEntry
+ (xcb:-struct)
+ ((active :initarg :active :type xcb:BOOL)
+ (mods-mask :initarg :mods-mask :type xcb:CARD8)
+ (level :initarg :level :type xcb:CARD8)
+ (mods-mods :initarg :mods-mods :type xcb:CARD8)
+ (mods-vmods :initarg :mods-vmods :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xkb:KeyType
+ (xcb:-struct)
+ ((mods-mask :initarg :mods-mask :type xcb:CARD8)
+ (mods-mods :initarg :mods-mods :type xcb:CARD8)
+ (mods-vmods :initarg :mods-vmods :type xcb:CARD16)
+ (numLevels :initarg :numLevels :type xcb:CARD8)
+ (nMapEntries :initarg :nMapEntries :type xcb:CARD8)
+ (hasPreserve :initarg :hasPreserve :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (map~ :initform
+ '(name map type xcb:xkb:KTMapEntry size
+ (xcb:-fieldref 'nMapEntries))
+ :type xcb:-list)
+ (map :initarg :map :type xcb:-ignore)
+ (preserve~ :initform
+ '(name preserve type xcb:xkb:ModDef size
+ (*
+ (xcb:-fieldref 'hasPreserve)
+ (xcb:-fieldref 'nMapEntries)))
+ :type xcb:-list)
+ (preserve :initarg :preserve :type xcb:-ignore)))
+
+(defclass xcb:xkb:KeySymMap
+ (xcb:-struct)
+ ((kt-index~ :initform
+ '(name kt-index type xcb:CARD8 size 4)
+ :type xcb:-list)
+ (kt-index :initarg :kt-index :type xcb:-ignore)
+ (groupInfo :initarg :groupInfo :type xcb:CARD8)
+ (width :initarg :width :type xcb:CARD8)
+ (nSyms :initarg :nSyms :type xcb:CARD16)
+ (syms~ :initform
+ '(name syms type xcb:KEYSYM size
+ (xcb:-fieldref 'nSyms))
+ :type xcb:-list)
+ (syms :initarg :syms :type xcb:-ignore)))
+
+(defclass xcb:xkb:CommonBehavior
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (data :initarg :data :type xcb:CARD8)))
+
+(defclass xcb:xkb:DefaultBehavior
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(xcb:deftypealias 'xcb:xkb:LockBehavior 'xcb:xkb:DefaultBehavior)
+
+(defclass xcb:xkb:RadioGroupBehavior
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (group :initarg :group :type xcb:CARD8)))
+
+(defclass xcb:xkb:OverlayBehavior
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (key :initarg :key :type xcb:KEYCODE)))
+
+(xcb:deftypealias 'xcb:xkb:PermamentLockBehavior 'xcb:xkb:LockBehavior)
+
+(xcb:deftypealias 'xcb:xkb:PermamentRadioGroupBehavior 'xcb:xkb:RadioGroupBehavior)
+
+(xcb:deftypealias 'xcb:xkb:PermamentOverlayBehavior 'xcb:xkb:OverlayBehavior)
+
+(defclass xcb:xkb:Behavior
+ (xcb:-union)
+ ((~size :initform 2)
+ (common :initarg :common :type xcb:xkb:CommonBehavior)
+ (default :initarg :default :type xcb:xkb:DefaultBehavior)
+ (lock :initarg :lock :type xcb:xkb:LockBehavior)
+ (radioGroup :initarg :radioGroup :type xcb:xkb:RadioGroupBehavior)
+ (overlay1 :initarg :overlay1 :type xcb:xkb:OverlayBehavior)
+ (overlay2 :initarg :overlay2 :type xcb:xkb:OverlayBehavior)
+ (permamentLock :initarg :permamentLock :type xcb:xkb:PermamentLockBehavior)
+ (permamentRadioGroup :initarg :permamentRadioGroup :type xcb:xkb:PermamentRadioGroupBehavior)
+ (permamentOverlay1 :initarg :permamentOverlay1 :type xcb:xkb:PermamentOverlayBehavior)
+ (permamentOverlay2 :initarg :permamentOverlay2 :type xcb:xkb:PermamentOverlayBehavior)
+ (type :initarg :type :type xcb:CARD8)))
+
+(defconst xcb:xkb:BehaviorType:Default 0)
+(defconst xcb:xkb:BehaviorType:Lock 1)
+(defconst xcb:xkb:BehaviorType:RadioGroup 2)
+(defconst xcb:xkb:BehaviorType:Overlay1 3)
+(defconst xcb:xkb:BehaviorType:Overlay2 4)
+(defconst xcb:xkb:BehaviorType:PermamentLock 129)
+(defconst xcb:xkb:BehaviorType:PermamentRadioGroup 130)
+(defconst xcb:xkb:BehaviorType:PermamentOverlay1 131)
+(defconst xcb:xkb:BehaviorType:PermamentOverlay2 132)
+
+(defclass xcb:xkb:SetBehavior
+ (xcb:-struct)
+ ((keycode :initarg :keycode :type xcb:KEYCODE)
+ (behavior :initarg :behavior :type xcb:xkb:Behavior)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:xkb:SetExplicit
+ (xcb:-struct)
+ ((keycode :initarg :keycode :type xcb:KEYCODE)
+ (explicit :initarg :explicit :type xcb:CARD8)))
+
+(defclass xcb:xkb:KeyModMap
+ (xcb:-struct)
+ ((keycode :initarg :keycode :type xcb:KEYCODE)
+ (mods :initarg :mods :type xcb:CARD8)))
+
+(defclass xcb:xkb:KeyVModMap
+ (xcb:-struct)
+ ((keycode :initarg :keycode :type xcb:KEYCODE)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (vmods :initarg :vmods :type xcb:CARD16)))
+
+(defclass xcb:xkb:KTSetMapEntry
+ (xcb:-struct)
+ ((level :initarg :level :type xcb:CARD8)
+ (realMods :initarg :realMods :type xcb:CARD8)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)))
+
+(defclass xcb:xkb:SetKeyType
+ (xcb:-struct)
+ ((mask :initarg :mask :type xcb:CARD8)
+ (realMods :initarg :realMods :type xcb:CARD8)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)
+ (numLevels :initarg :numLevels :type xcb:CARD8)
+ (nMapEntries :initarg :nMapEntries :type xcb:CARD8)
+ (preserve :initarg :preserve :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (entries~ :initform
+ '(name entries type xcb:xkb:KTSetMapEntry size
+ (xcb:-fieldref 'nMapEntries))
+ :type xcb:-list)
+ (entries :initarg :entries :type xcb:-ignore)
+ (preserve-entries~ :initform
+ '(name preserve-entries type xcb:xkb:KTSetMapEntry size
+ (*
+ (xcb:-fieldref 'preserve)
+ (xcb:-fieldref 'nMapEntries)))
+ :type xcb:-list)
+ (preserve-entries :initarg :preserve-entries :type xcb:-ignore)))
+
+(xcb:deftypealias 'xcb:xkb:STRING8 'xcb:char)
+
+(defclass xcb:xkb:Outline
+ (xcb:-struct)
+ ((nPoints :initarg :nPoints :type xcb:CARD8)
+ (cornerRadius :initarg :cornerRadius :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (points~ :initform
+ '(name points type xcb:POINT size
+ (xcb:-fieldref 'nPoints))
+ :type xcb:-list)
+ (points :initarg :points :type xcb:-ignore)))
+
+(defclass xcb:xkb:Shape
+ (xcb:-struct)
+ ((name :initarg :name :type xcb:ATOM)
+ (nOutlines :initarg :nOutlines :type xcb:CARD8)
+ (primaryNdx :initarg :primaryNdx :type xcb:CARD8)
+ (approxNdx :initarg :approxNdx :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (outlines~ :initform
+ '(name outlines type xcb:xkb:Outline size
+ (xcb:-fieldref 'nOutlines))
+ :type xcb:-list)
+ (outlines :initarg :outlines :type xcb:-ignore)))
+
+(defclass xcb:xkb:Key
+ (xcb:-struct)
+ ((name~ :initform
+ '(name name type xcb:xkb:STRING8 size 4)
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (gap :initarg :gap :type xcb:INT16)
+ (shapeNdx :initarg :shapeNdx :type xcb:CARD8)
+ (colorNdx :initarg :colorNdx :type xcb:CARD8)))
+
+(defclass xcb:xkb:OverlayKey
+ (xcb:-struct)
+ ((over~ :initform
+ '(name over type xcb:xkb:STRING8 size 4)
+ :type xcb:-list)
+ (over :initarg :over :type xcb:-ignore)
+ (under~ :initform
+ '(name under type xcb:xkb:STRING8 size 4)
+ :type xcb:-list)
+ (under :initarg :under :type xcb:-ignore)))
+
+(defclass xcb:xkb:OverlayRow
+ (xcb:-struct)
+ ((rowUnder :initarg :rowUnder :type xcb:CARD8)
+ (nKeys :initarg :nKeys :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (keys~ :initform
+ '(name keys type xcb:xkb:OverlayKey size
+ (xcb:-fieldref 'nKeys))
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)))
+
+(defclass xcb:xkb:Overlay
+ (xcb:-struct)
+ ((name :initarg :name :type xcb:ATOM)
+ (nRows :initarg :nRows :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (rows~ :initform
+ '(name rows type xcb:xkb:OverlayRow size
+ (xcb:-fieldref 'nRows))
+ :type xcb:-list)
+ (rows :initarg :rows :type xcb:-ignore)))
+
+(defclass xcb:xkb:Row
+ (xcb:-struct)
+ ((top :initarg :top :type xcb:INT16)
+ (left :initarg :left :type xcb:INT16)
+ (nKeys :initarg :nKeys :type xcb:CARD8)
+ (vertical :initarg :vertical :type xcb:BOOL)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (keys~ :initform
+ '(name keys type xcb:xkb:Key size
+ (xcb:-fieldref 'nKeys))
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)))
+
+(defconst xcb:xkb:DoodadType:Outline 1)
+(defconst xcb:xkb:DoodadType:Solid 2)
+(defconst xcb:xkb:DoodadType:Text 3)
+(defconst xcb:xkb:DoodadType:Indicator 4)
+(defconst xcb:xkb:DoodadType:Logo 5)
+
+(defclass xcb:xkb:Listing
+ (xcb:-struct)
+ ((flags :initarg :flags :type xcb:CARD16)
+ (length :initarg :length :type xcb:CARD16)
+ (string~ :initform
+ '(name string type xcb:xkb:STRING8 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)
+ (pad~0 :initform 2 :type xcb:-pad-align)))
+
+(defclass xcb:xkb:DeviceLedInfo
+ (xcb:-struct)
+ ((ledClass :initarg :ledClass :type xcb:xkb:LedClassSpec)
+ (ledID :initarg :ledID :type xcb:xkb:IDSpec)
+ (namesPresent :initarg :namesPresent :type xcb:CARD32)
+ (mapsPresent :initarg :mapsPresent :type xcb:CARD32)
+ (physIndicators :initarg :physIndicators :type xcb:CARD32)
+ (state :initarg :state :type xcb:CARD32)
+ (names~ :initform
+ '(name names type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'namesPresent)))
+ :type xcb:-list)
+ (names :initarg :names :type xcb:-ignore)
+ (maps~ :initform
+ '(name maps type xcb:xkb:IndicatorMap size
+ (logcount
+ (xcb:-fieldref 'mapsPresent)))
+ :type xcb:-list)
+ (maps :initarg :maps :type xcb:-ignore)))
+
+(defconst xcb:xkb:Error:BadDevice 255)
+(defconst xcb:xkb:Error:BadClass 254)
+(defconst xcb:xkb:Error:BadId 253)
+
+(defclass xcb:xkb:Keyboard
+ (xcb:-error)
+ ((~code :initform 0)
+ (value :initarg :value :type xcb:CARD32)
+ (minorOpcode :initarg :minorOpcode :type xcb:CARD16)
+ (majorOpcode :initarg :majorOpcode :type xcb:CARD8)
+ (pad~0 :initform 21 :type xcb:-pad)))
+
+(defconst xcb:xkb:SA:ClearLocks 1)
+(defconst xcb:xkb:SA:LatchToLock 2)
+(defconst xcb:xkb:SA:UseModMapMods 4)
+(defconst xcb:xkb:SA:GroupAbsolute 4)
+
+(defconst xcb:xkb:SAType:NoAction 0)
+(defconst xcb:xkb:SAType:SetMods 1)
+(defconst xcb:xkb:SAType:LatchMods 2)
+(defconst xcb:xkb:SAType:LockMods 3)
+(defconst xcb:xkb:SAType:SetGroup 4)
+(defconst xcb:xkb:SAType:LatchGroup 5)
+(defconst xcb:xkb:SAType:LockGroup 6)
+(defconst xcb:xkb:SAType:MovePtr 7)
+(defconst xcb:xkb:SAType:PtrBtn 8)
+(defconst xcb:xkb:SAType:LockPtrBtn 9)
+(defconst xcb:xkb:SAType:SetPtrDflt 10)
+(defconst xcb:xkb:SAType:ISOLock 11)
+(defconst xcb:xkb:SAType:Terminate 12)
+(defconst xcb:xkb:SAType:SwitchScreen 13)
+(defconst xcb:xkb:SAType:SetControls 14)
+(defconst xcb:xkb:SAType:LockControls 15)
+(defconst xcb:xkb:SAType:ActionMessage 16)
+(defconst xcb:xkb:SAType:RedirectKey 17)
+(defconst xcb:xkb:SAType:DeviceBtn 18)
+(defconst xcb:xkb:SAType:LockDeviceBtn 19)
+(defconst xcb:xkb:SAType:DeviceValuator 20)
+
+(defclass xcb:xkb:SANoAction
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (pad~0 :initform 7 :type xcb:-pad)))
+
+(defclass xcb:xkb:SASetMods
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (mask :initarg :mask :type xcb:CARD8)
+ (realMods :initarg :realMods :type xcb:CARD8)
+ (vmodsHigh :initarg :vmodsHigh :type xcb:CARD8)
+ (vmodsLow :initarg :vmodsLow :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(xcb:deftypealias 'xcb:xkb:SALatchMods 'xcb:xkb:SASetMods)
+
+(xcb:deftypealias 'xcb:xkb:SALockMods 'xcb:xkb:SASetMods)
+
+(defclass xcb:xkb:SASetGroup
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (group :initarg :group :type xcb:INT8)
+ (pad~0 :initform 5 :type xcb:-pad)))
+
+(xcb:deftypealias 'xcb:xkb:SALatchGroup 'xcb:xkb:SASetGroup)
+
+(xcb:deftypealias 'xcb:xkb:SALockGroup 'xcb:xkb:SASetGroup)
+
+(defconst xcb:xkb:SAMovePtrFlag:NoAcceleration 1)
+(defconst xcb:xkb:SAMovePtrFlag:MoveAbsoluteX 2)
+(defconst xcb:xkb:SAMovePtrFlag:MoveAbsoluteY 4)
+
+(defclass xcb:xkb:SAMovePtr
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (xHigh :initarg :xHigh :type xcb:INT8)
+ (xLow :initarg :xLow :type xcb:CARD8)
+ (yHigh :initarg :yHigh :type xcb:INT8)
+ (yLow :initarg :yLow :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xkb:SAPtrBtn
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (count :initarg :count :type xcb:CARD8)
+ (button :initarg :button :type xcb:CARD8)
+ (pad~0 :initform 4 :type xcb:-pad)))
+
+(defclass xcb:xkb:SALockPtrBtn
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (button :initarg :button :type xcb:CARD8)
+ (pad~1 :initform 4 :type xcb:-pad)))
+
+(defconst xcb:xkb:SASetPtrDfltFlag:DfltBtnAbsolute 4)
+(defconst xcb:xkb:SASetPtrDfltFlag:AffectDfltButton 1)
+
+(defclass xcb:xkb:SASetPtrDflt
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (affect :initarg :affect :type xcb:CARD8)
+ (value :initarg :value :type xcb:INT8)
+ (pad~0 :initform 4 :type xcb:-pad)))
+
+(defconst xcb:xkb:SAIsoLockFlag:NoLock 1)
+(defconst xcb:xkb:SAIsoLockFlag:NoUnlock 2)
+(defconst xcb:xkb:SAIsoLockFlag:UseModMapMods 4)
+(defconst xcb:xkb:SAIsoLockFlag:GroupAbsolute 4)
+(defconst xcb:xkb:SAIsoLockFlag:ISODfltIsGroup 8)
+
+(defconst xcb:xkb:SAIsoLockNoAffect:Ctrls 8)
+(defconst xcb:xkb:SAIsoLockNoAffect:Ptr 16)
+(defconst xcb:xkb:SAIsoLockNoAffect:Group 32)
+(defconst xcb:xkb:SAIsoLockNoAffect:Mods 64)
+
+(defclass xcb:xkb:SAIsoLock
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (mask :initarg :mask :type xcb:CARD8)
+ (realMods :initarg :realMods :type xcb:CARD8)
+ (group :initarg :group :type xcb:INT8)
+ (affect :initarg :affect :type xcb:CARD8)
+ (vmodsHigh :initarg :vmodsHigh :type xcb:CARD8)
+ (vmodsLow :initarg :vmodsLow :type xcb:CARD8)))
+
+(defclass xcb:xkb:SATerminate
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (pad~0 :initform 7 :type xcb:-pad)))
+
+(defconst xcb:xkb:SwitchScreenFlag:Application 1)
+(defconst xcb:xkb:SwitchScreenFlag:Absolute 4)
+
+(defclass xcb:xkb:SASwitchScreen
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (newScreen :initarg :newScreen :type xcb:INT8)
+ (pad~0 :initform 5 :type xcb:-pad)))
+
+(defconst xcb:xkb:BoolCtrlsHigh:AccessXFeedback 1)
+(defconst xcb:xkb:BoolCtrlsHigh:AudibleBell 2)
+(defconst xcb:xkb:BoolCtrlsHigh:Overlay1 4)
+(defconst xcb:xkb:BoolCtrlsHigh:Overlay2 8)
+(defconst xcb:xkb:BoolCtrlsHigh:IgnoreGroupLock 16)
+
+(defconst xcb:xkb:BoolCtrlsLow:RepeatKeys 1)
+(defconst xcb:xkb:BoolCtrlsLow:SlowKeys 2)
+(defconst xcb:xkb:BoolCtrlsLow:BounceKeys 4)
+(defconst xcb:xkb:BoolCtrlsLow:StickyKeys 8)
+(defconst xcb:xkb:BoolCtrlsLow:MouseKeys 16)
+(defconst xcb:xkb:BoolCtrlsLow:MouseKeysAccel 32)
+(defconst xcb:xkb:BoolCtrlsLow:AccessXKeys 64)
+(defconst xcb:xkb:BoolCtrlsLow:AccessXTimeout 128)
+
+(defclass xcb:xkb:SASetControls
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (boolCtrlsHigh :initarg :boolCtrlsHigh :type xcb:CARD8)
+ (boolCtrlsLow :initarg :boolCtrlsLow :type xcb:CARD8)
+ (pad~1 :initform 2 :type xcb:-pad)))
+
+(xcb:deftypealias 'xcb:xkb:SALockControls 'xcb:xkb:SASetControls)
+
+(defconst xcb:xkb:ActionMessageFlag:OnPress 1)
+(defconst xcb:xkb:ActionMessageFlag:OnRelease 2)
+(defconst xcb:xkb:ActionMessageFlag:GenKeyEvent 4)
+
+(defclass xcb:xkb:SAActionMessage
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (message~ :initform
+ '(name message type xcb:CARD8 size 6)
+ :type xcb:-list)
+ (message :initarg :message :type xcb:-ignore)))
+
+(defclass xcb:xkb:SARedirectKey
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (newkey :initarg :newkey :type xcb:KEYCODE)
+ (mask :initarg :mask :type xcb:CARD8)
+ (realModifiers :initarg :realModifiers :type xcb:CARD8)
+ (vmodsMaskHigh :initarg :vmodsMaskHigh :type xcb:CARD8)
+ (vmodsMaskLow :initarg :vmodsMaskLow :type xcb:CARD8)
+ (vmodsHigh :initarg :vmodsHigh :type xcb:CARD8)
+ (vmodsLow :initarg :vmodsLow :type xcb:CARD8)))
+
+(defclass xcb:xkb:SADeviceBtn
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (count :initarg :count :type xcb:CARD8)
+ (button :initarg :button :type xcb:CARD8)
+ (device :initarg :device :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defconst xcb:xkb:LockDeviceFlags:NoLock 1)
+(defconst xcb:xkb:LockDeviceFlags:NoUnlock 2)
+
+(defclass xcb:xkb:SALockDeviceBtn
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (button :initarg :button :type xcb:CARD8)
+ (device :initarg :device :type xcb:CARD8)
+ (pad~1 :initform 3 :type xcb:-pad)))
+
+(defconst xcb:xkb:SAValWhat:IgnoreVal 0)
+(defconst xcb:xkb:SAValWhat:SetValMin 1)
+(defconst xcb:xkb:SAValWhat:SetValCenter 2)
+(defconst xcb:xkb:SAValWhat:SetValMax 3)
+(defconst xcb:xkb:SAValWhat:SetValRelative 4)
+(defconst xcb:xkb:SAValWhat:SetValAbsolute 5)
+
+(defclass xcb:xkb:SADeviceValuator
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (device :initarg :device :type xcb:CARD8)
+ (val1what :initarg :val1what :type xcb:CARD8)
+ (val1index :initarg :val1index :type xcb:CARD8)
+ (val1value :initarg :val1value :type xcb:CARD8)
+ (val2what :initarg :val2what :type xcb:CARD8)
+ (val2index :initarg :val2index :type xcb:CARD8)
+ (val2value :initarg :val2value :type xcb:CARD8)))
+
+(defclass xcb:xkb:SIAction
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (data~ :initform
+ '(name data type xcb:CARD8 size 7)
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:xkb:SymInterpret
+ (xcb:-struct)
+ ((sym :initarg :sym :type xcb:KEYSYM)
+ (mods :initarg :mods :type xcb:CARD8)
+ (match :initarg :match :type xcb:CARD8)
+ (virtualMod :initarg :virtualMod :type xcb:CARD8)
+ (flags :initarg :flags :type xcb:CARD8)
+ (action :initarg :action :type xcb:xkb:SIAction)))
+
+(defclass xcb:xkb:Action
+ (xcb:-union)
+ ((~size :initform 8)
+ (noaction :initarg :noaction :type xcb:xkb:SANoAction)
+ (setmods :initarg :setmods :type xcb:xkb:SASetMods)
+ (latchmods :initarg :latchmods :type xcb:xkb:SALatchMods)
+ (lockmods :initarg :lockmods :type xcb:xkb:SALockMods)
+ (setgroup :initarg :setgroup :type xcb:xkb:SASetGroup)
+ (latchgroup :initarg :latchgroup :type xcb:xkb:SALatchGroup)
+ (lockgroup :initarg :lockgroup :type xcb:xkb:SALockGroup)
+ (moveptr :initarg :moveptr :type xcb:xkb:SAMovePtr)
+ (ptrbtn :initarg :ptrbtn :type xcb:xkb:SAPtrBtn)
+ (lockptrbtn :initarg :lockptrbtn :type xcb:xkb:SALockPtrBtn)
+ (setptrdflt :initarg :setptrdflt :type xcb:xkb:SASetPtrDflt)
+ (isolock :initarg :isolock :type xcb:xkb:SAIsoLock)
+ (terminate :initarg :terminate :type xcb:xkb:SATerminate)
+ (switchscreen :initarg :switchscreen :type xcb:xkb:SASwitchScreen)
+ (setcontrols :initarg :setcontrols :type xcb:xkb:SASetControls)
+ (lockcontrols :initarg :lockcontrols :type xcb:xkb:SALockControls)
+ (message :initarg :message :type xcb:xkb:SAActionMessage)
+ (redirect :initarg :redirect :type xcb:xkb:SARedirectKey)
+ (devbtn :initarg :devbtn :type xcb:xkb:SADeviceBtn)
+ (lockdevbtn :initarg :lockdevbtn :type xcb:xkb:SALockDeviceBtn)
+ (devval :initarg :devval :type xcb:xkb:SADeviceValuator)
+ (type :initarg :type :type xcb:CARD8)))
+
+(defclass xcb:xkb:UseExtension
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (wantedMajor :initarg :wantedMajor :type xcb:CARD16)
+ (wantedMinor :initarg :wantedMinor :type xcb:CARD16)))
+(defclass xcb:xkb:UseExtension~reply
+ (xcb:-reply)
+ ((supported :initarg :supported :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (serverMajor :initarg :serverMajor :type xcb:CARD16)
+ (serverMinor :initarg :serverMinor :type xcb:CARD16)
+ (pad~0 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:xkb:SelectEvents
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (affectWhich :initarg :affectWhich :type xcb:CARD16)
+ (clear :initarg :clear :type xcb:CARD16)
+ (selectAll :initarg :selectAll :type xcb:CARD16)
+ (affectMap :initarg :affectMap :type xcb:CARD16)
+ (map :initarg :map :type xcb:CARD16)
+ (details :initform
+ '(expression
+ (logand
+ (xcb:-fieldref 'affectWhich)
+ (logand
+ (lognot
+ (xcb:-fieldref 'clear))
+ (lognot
+ (xcb:-fieldref 'selectAll))))
+ cases
+ ((1 affectNewKeyboard newKeyboardDetails)
+ (4 affectState stateDetails)
+ (8 affectCtrls ctrlDetails)
+ (16 affectIndicatorState indicatorStateDetails)
+ (32 affectIndicatorMap indicatorMapDetails)
+ (64 affectNames namesDetails)
+ (128 affectCompat compatDetails)
+ (256 affectBell bellDetails)
+ (512 affectMsgDetails msgDetails)
+ (1024 affectAccessX accessXDetails)
+ (2048 affectExtDev extdevDetails)))
+ :type xcb:-switch)
+ (affectNewKeyboard :initarg :affectNewKeyboard :type xcb:CARD16)
+ (newKeyboardDetails :initarg :newKeyboardDetails :type xcb:CARD16)
+ (affectState :initarg :affectState :type xcb:CARD16)
+ (stateDetails :initarg :stateDetails :type xcb:CARD16)
+ (affectCtrls :initarg :affectCtrls :type xcb:CARD32)
+ (ctrlDetails :initarg :ctrlDetails :type xcb:CARD32)
+ (affectIndicatorState :initarg :affectIndicatorState :type xcb:CARD32)
+ (indicatorStateDetails :initarg :indicatorStateDetails :type xcb:CARD32)
+ (affectIndicatorMap :initarg :affectIndicatorMap :type xcb:CARD32)
+ (indicatorMapDetails :initarg :indicatorMapDetails :type xcb:CARD32)
+ (affectNames :initarg :affectNames :type xcb:CARD16)
+ (namesDetails :initarg :namesDetails :type xcb:CARD16)
+ (affectCompat :initarg :affectCompat :type xcb:CARD8)
+ (compatDetails :initarg :compatDetails :type xcb:CARD8)
+ (affectBell :initarg :affectBell :type xcb:CARD8)
+ (bellDetails :initarg :bellDetails :type xcb:CARD8)
+ (affectMsgDetails :initarg :affectMsgDetails :type xcb:CARD8)
+ (msgDetails :initarg :msgDetails :type xcb:CARD8)
+ (affectAccessX :initarg :affectAccessX :type xcb:CARD16)
+ (accessXDetails :initarg :accessXDetails :type xcb:CARD16)
+ (affectExtDev :initarg :affectExtDev :type xcb:CARD16)
+ (extdevDetails :initarg :extdevDetails :type xcb:CARD16)))
+
+(defclass xcb:xkb:Bell
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (bellClass :initarg :bellClass :type xcb:xkb:BellClassSpec)
+ (bellID :initarg :bellID :type xcb:xkb:IDSpec)
+ (percent :initarg :percent :type xcb:INT8)
+ (forceSound :initarg :forceSound :type xcb:BOOL)
+ (eventOnly :initarg :eventOnly :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (pitch :initarg :pitch :type xcb:INT16)
+ (duration :initarg :duration :type xcb:INT16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (name :initarg :name :type xcb:ATOM)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:xkb:GetState
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xkb:GetState~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (mods :initarg :mods :type xcb:CARD8)
+ (baseMods :initarg :baseMods :type xcb:CARD8)
+ (latchedMods :initarg :latchedMods :type xcb:CARD8)
+ (lockedMods :initarg :lockedMods :type xcb:CARD8)
+ (group :initarg :group :type xcb:CARD8)
+ (lockedGroup :initarg :lockedGroup :type xcb:CARD8)
+ (baseGroup :initarg :baseGroup :type xcb:INT16)
+ (latchedGroup :initarg :latchedGroup :type xcb:INT16)
+ (compatState :initarg :compatState :type xcb:CARD8)
+ (grabMods :initarg :grabMods :type xcb:CARD8)
+ (compatGrabMods :initarg :compatGrabMods :type xcb:CARD8)
+ (lookupMods :initarg :lookupMods :type xcb:CARD8)
+ (compatLookupMods :initarg :compatLookupMods :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (ptrBtnState :initarg :ptrBtnState :type xcb:CARD16)
+ (pad~1 :initform 6 :type xcb:-pad)))
+
+(defclass xcb:xkb:LatchLockState
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (affectModLocks :initarg :affectModLocks :type xcb:CARD8)
+ (modLocks :initarg :modLocks :type xcb:CARD8)
+ (lockGroup :initarg :lockGroup :type xcb:BOOL)
+ (groupLock :initarg :groupLock :type xcb:CARD8)
+ (affectModLatches :initarg :affectModLatches :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (latchGroup :initarg :latchGroup :type xcb:BOOL)
+ (groupLatch :initarg :groupLatch :type xcb:CARD16)))
+
+(defclass xcb:xkb:GetControls
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xkb:GetControls~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (mouseKeysDfltBtn :initarg :mouseKeysDfltBtn :type xcb:CARD8)
+ (numGroups :initarg :numGroups :type xcb:CARD8)
+ (groupsWrap :initarg :groupsWrap :type xcb:CARD8)
+ (internalModsMask :initarg :internalModsMask :type xcb:CARD8)
+ (ignoreLockModsMask :initarg :ignoreLockModsMask :type xcb:CARD8)
+ (internalModsRealMods :initarg :internalModsRealMods :type xcb:CARD8)
+ (ignoreLockModsRealMods :initarg :ignoreLockModsRealMods :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (internalModsVmods :initarg :internalModsVmods :type xcb:CARD16)
+ (ignoreLockModsVmods :initarg :ignoreLockModsVmods :type xcb:CARD16)
+ (repeatDelay :initarg :repeatDelay :type xcb:CARD16)
+ (repeatInterval :initarg :repeatInterval :type xcb:CARD16)
+ (slowKeysDelay :initarg :slowKeysDelay :type xcb:CARD16)
+ (debounceDelay :initarg :debounceDelay :type xcb:CARD16)
+ (mouseKeysDelay :initarg :mouseKeysDelay :type xcb:CARD16)
+ (mouseKeysInterval :initarg :mouseKeysInterval :type xcb:CARD16)
+ (mouseKeysTimeToMax :initarg :mouseKeysTimeToMax :type xcb:CARD16)
+ (mouseKeysMaxSpeed :initarg :mouseKeysMaxSpeed :type xcb:CARD16)
+ (mouseKeysCurve :initarg :mouseKeysCurve :type xcb:INT16)
+ (accessXOption :initarg :accessXOption :type xcb:CARD16)
+ (accessXTimeout :initarg :accessXTimeout :type xcb:CARD16)
+ (accessXTimeoutOptionsMask :initarg :accessXTimeoutOptionsMask :type xcb:CARD16)
+ (accessXTimeoutOptionsValues :initarg :accessXTimeoutOptionsValues :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (accessXTimeoutMask :initarg :accessXTimeoutMask :type xcb:CARD32)
+ (accessXTimeoutValues :initarg :accessXTimeoutValues :type xcb:CARD32)
+ (enabledControls :initarg :enabledControls :type xcb:CARD32)
+ (perKeyRepeat~ :initform
+ '(name perKeyRepeat type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (perKeyRepeat :initarg :perKeyRepeat :type xcb:-ignore)))
+
+(defclass xcb:xkb:SetControls
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (affectInternalRealMods :initarg :affectInternalRealMods :type xcb:CARD8)
+ (internalRealMods :initarg :internalRealMods :type xcb:CARD8)
+ (affectIgnoreLockRealMods :initarg :affectIgnoreLockRealMods :type xcb:CARD8)
+ (ignoreLockRealMods :initarg :ignoreLockRealMods :type xcb:CARD8)
+ (affectInternalVirtualMods :initarg :affectInternalVirtualMods :type xcb:CARD16)
+ (internalVirtualMods :initarg :internalVirtualMods :type xcb:CARD16)
+ (affectIgnoreLockVirtualMods :initarg :affectIgnoreLockVirtualMods :type xcb:CARD16)
+ (ignoreLockVirtualMods :initarg :ignoreLockVirtualMods :type xcb:CARD16)
+ (mouseKeysDfltBtn :initarg :mouseKeysDfltBtn :type xcb:CARD8)
+ (groupsWrap :initarg :groupsWrap :type xcb:CARD8)
+ (accessXOptions :initarg :accessXOptions :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (affectEnabledControls :initarg :affectEnabledControls :type xcb:CARD32)
+ (enabledControls :initarg :enabledControls :type xcb:CARD32)
+ (changeControls :initarg :changeControls :type xcb:CARD32)
+ (repeatDelay :initarg :repeatDelay :type xcb:CARD16)
+ (repeatInterval :initarg :repeatInterval :type xcb:CARD16)
+ (slowKeysDelay :initarg :slowKeysDelay :type xcb:CARD16)
+ (debounceDelay :initarg :debounceDelay :type xcb:CARD16)
+ (mouseKeysDelay :initarg :mouseKeysDelay :type xcb:CARD16)
+ (mouseKeysInterval :initarg :mouseKeysInterval :type xcb:CARD16)
+ (mouseKeysTimeToMax :initarg :mouseKeysTimeToMax :type xcb:CARD16)
+ (mouseKeysMaxSpeed :initarg :mouseKeysMaxSpeed :type xcb:CARD16)
+ (mouseKeysCurve :initarg :mouseKeysCurve :type xcb:INT16)
+ (accessXTimeout :initarg :accessXTimeout :type xcb:CARD16)
+ (accessXTimeoutMask :initarg :accessXTimeoutMask :type xcb:CARD32)
+ (accessXTimeoutValues :initarg :accessXTimeoutValues :type xcb:CARD32)
+ (accessXTimeoutOptionsMask :initarg :accessXTimeoutOptionsMask :type xcb:CARD16)
+ (accessXTimeoutOptionsValues :initarg :accessXTimeoutOptionsValues :type xcb:CARD16)
+ (perKeyRepeat~ :initform
+ '(name perKeyRepeat type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (perKeyRepeat :initarg :perKeyRepeat :type xcb:-ignore)))
+
+(defclass xcb:xkb:GetMap
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (full :initarg :full :type xcb:CARD16)
+ (partial :initarg :partial :type xcb:CARD16)
+ (firstType :initarg :firstType :type xcb:CARD8)
+ (nTypes :initarg :nTypes :type xcb:CARD8)
+ (firstKeySym :initarg :firstKeySym :type xcb:KEYCODE)
+ (nKeySyms :initarg :nKeySyms :type xcb:CARD8)
+ (firstKeyAction :initarg :firstKeyAction :type xcb:KEYCODE)
+ (nKeyActions :initarg :nKeyActions :type xcb:CARD8)
+ (firstKeyBehavior :initarg :firstKeyBehavior :type xcb:KEYCODE)
+ (nKeyBehaviors :initarg :nKeyBehaviors :type xcb:CARD8)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)
+ (firstKeyExplicit :initarg :firstKeyExplicit :type xcb:KEYCODE)
+ (nKeyExplicit :initarg :nKeyExplicit :type xcb:CARD8)
+ (firstModMapKey :initarg :firstModMapKey :type xcb:KEYCODE)
+ (nModMapKeys :initarg :nModMapKeys :type xcb:CARD8)
+ (firstVModMapKey :initarg :firstVModMapKey :type xcb:KEYCODE)
+ (nVModMapKeys :initarg :nVModMapKeys :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xkb:GetMap~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (minKeyCode :initarg :minKeyCode :type xcb:KEYCODE)
+ (maxKeyCode :initarg :maxKeyCode :type xcb:KEYCODE)
+ (present :initarg :present :type xcb:CARD16)
+ (firstType :initarg :firstType :type xcb:CARD8)
+ (nTypes :initarg :nTypes :type xcb:CARD8)
+ (totalTypes :initarg :totalTypes :type xcb:CARD8)
+ (firstKeySym :initarg :firstKeySym :type xcb:KEYCODE)
+ (totalSyms :initarg :totalSyms :type xcb:CARD16)
+ (nKeySyms :initarg :nKeySyms :type xcb:CARD8)
+ (firstKeyAction :initarg :firstKeyAction :type xcb:KEYCODE)
+ (totalActions :initarg :totalActions :type xcb:CARD16)
+ (nKeyActions :initarg :nKeyActions :type xcb:CARD8)
+ (firstKeyBehavior :initarg :firstKeyBehavior :type xcb:KEYCODE)
+ (nKeyBehaviors :initarg :nKeyBehaviors :type xcb:CARD8)
+ (totalKeyBehaviors :initarg :totalKeyBehaviors :type xcb:CARD8)
+ (firstKeyExplicit :initarg :firstKeyExplicit :type xcb:KEYCODE)
+ (nKeyExplicit :initarg :nKeyExplicit :type xcb:CARD8)
+ (totalKeyExplicit :initarg :totalKeyExplicit :type xcb:CARD8)
+ (firstModMapKey :initarg :firstModMapKey :type xcb:KEYCODE)
+ (nModMapKeys :initarg :nModMapKeys :type xcb:CARD8)
+ (totalModMapKeys :initarg :totalModMapKeys :type xcb:CARD8)
+ (firstVModMapKey :initarg :firstVModMapKey :type xcb:KEYCODE)
+ (nVModMapKeys :initarg :nVModMapKeys :type xcb:CARD8)
+ (totalVModMapKeys :initarg :totalVModMapKeys :type xcb:CARD8)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)
+ (map :initform
+ '(expression
+ (xcb:-fieldref 'present)
+ cases
+ ((1 types-rtrn~)
+ (2 syms-rtrn~)
+ (16 acts-rtrn-count~ pad~2 acts-rtrn-acts~)
+ (32 behaviors-rtrn~)
+ (64 vmods-rtrn~ pad~3)
+ (8 explicit-rtrn~ pad~4)
+ (4 modmap-rtrn~ pad~5)
+ (128 vmodmap-rtrn~)))
+ :type xcb:-switch)
+ (types-rtrn~ :initform
+ '(name types-rtrn type xcb:xkb:KeyType size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (types-rtrn :initarg :types-rtrn :type xcb:-ignore)
+ (syms-rtrn~ :initform
+ '(name syms-rtrn type xcb:xkb:KeySymMap size
+ (xcb:-fieldref 'nKeySyms))
+ :type xcb:-list)
+ (syms-rtrn :initarg :syms-rtrn :type xcb:-ignore)
+ (acts-rtrn-count~ :initform
+ '(name acts-rtrn-count type xcb:CARD8 size
+ (xcb:-fieldref 'nKeyActions))
+ :type xcb:-list)
+ (acts-rtrn-count :initarg :acts-rtrn-count :type xcb:-ignore)
+ (pad~2 :initform 4 :type xcb:-pad-align)
+ (acts-rtrn-acts~ :initform
+ '(name acts-rtrn-acts type xcb:xkb:Action size
+ (xcb:-fieldref 'totalActions))
+ :type xcb:-list)
+ (acts-rtrn-acts :initarg :acts-rtrn-acts :type xcb:-ignore)
+ (behaviors-rtrn~ :initform
+ '(name behaviors-rtrn type xcb:xkb:SetBehavior size
+ (xcb:-fieldref 'totalKeyBehaviors))
+ :type xcb:-list)
+ (behaviors-rtrn :initarg :behaviors-rtrn :type xcb:-ignore)
+ (vmods-rtrn~ :initform
+ '(name vmods-rtrn type xcb:CARD8 size
+ (logcount
+ (xcb:-fieldref 'virtualMods)))
+ :type xcb:-list)
+ (vmods-rtrn :initarg :vmods-rtrn :type xcb:-ignore)
+ (pad~3 :initform 4 :type xcb:-pad-align)
+ (explicit-rtrn~ :initform
+ '(name explicit-rtrn type xcb:xkb:SetExplicit size
+ (xcb:-fieldref 'totalKeyExplicit))
+ :type xcb:-list)
+ (explicit-rtrn :initarg :explicit-rtrn :type xcb:-ignore)
+ (pad~4 :initform 4 :type xcb:-pad-align)
+ (modmap-rtrn~ :initform
+ '(name modmap-rtrn type xcb:xkb:KeyModMap size
+ (xcb:-fieldref 'totalModMapKeys))
+ :type xcb:-list)
+ (modmap-rtrn :initarg :modmap-rtrn :type xcb:-ignore)
+ (pad~5 :initform 4 :type xcb:-pad-align)
+ (vmodmap-rtrn~ :initform
+ '(name vmodmap-rtrn type xcb:xkb:KeyVModMap size
+ (xcb:-fieldref 'totalVModMapKeys))
+ :type xcb:-list)
+ (vmodmap-rtrn :initarg :vmodmap-rtrn :type xcb:-ignore)))
+
+(defclass xcb:xkb:SetMap
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (present :initarg :present :type xcb:CARD16)
+ (flags :initarg :flags :type xcb:CARD16)
+ (minKeyCode :initarg :minKeyCode :type xcb:KEYCODE)
+ (maxKeyCode :initarg :maxKeyCode :type xcb:KEYCODE)
+ (firstType :initarg :firstType :type xcb:CARD8)
+ (nTypes :initarg :nTypes :type xcb:CARD8)
+ (firstKeySym :initarg :firstKeySym :type xcb:KEYCODE)
+ (nKeySyms :initarg :nKeySyms :type xcb:CARD8)
+ (totalSyms :initarg :totalSyms :type xcb:CARD16)
+ (firstKeyAction :initarg :firstKeyAction :type xcb:KEYCODE)
+ (nKeyActions :initarg :nKeyActions :type xcb:CARD8)
+ (totalActions :initarg :totalActions :type xcb:CARD16)
+ (firstKeyBehavior :initarg :firstKeyBehavior :type xcb:KEYCODE)
+ (nKeyBehaviors :initarg :nKeyBehaviors :type xcb:CARD8)
+ (totalKeyBehaviors :initarg :totalKeyBehaviors :type xcb:CARD8)
+ (firstKeyExplicit :initarg :firstKeyExplicit :type xcb:KEYCODE)
+ (nKeyExplicit :initarg :nKeyExplicit :type xcb:CARD8)
+ (totalKeyExplicit :initarg :totalKeyExplicit :type xcb:CARD8)
+ (firstModMapKey :initarg :firstModMapKey :type xcb:KEYCODE)
+ (nModMapKeys :initarg :nModMapKeys :type xcb:CARD8)
+ (totalModMapKeys :initarg :totalModMapKeys :type xcb:CARD8)
+ (firstVModMapKey :initarg :firstVModMapKey :type xcb:KEYCODE)
+ (nVModMapKeys :initarg :nVModMapKeys :type xcb:CARD8)
+ (totalVModMapKeys :initarg :totalVModMapKeys :type xcb:CARD8)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)
+ (values :initform
+ '(expression
+ (xcb:-fieldref 'present)
+ cases
+ ((1 types~)
+ (2 syms~)
+ (16 actionsCount~ pad~0 actions~)
+ (32 behaviors~)
+ (64 vmods~ pad~1)
+ (8 explicit~)
+ (4 modmap~)
+ (128 vmodmap~)))
+ :type xcb:-switch)
+ (types~ :initform
+ '(name types type xcb:xkb:SetKeyType size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (types :initarg :types :type xcb:-ignore)
+ (syms~ :initform
+ '(name syms type xcb:xkb:KeySymMap size
+ (xcb:-fieldref 'nKeySyms))
+ :type xcb:-list)
+ (syms :initarg :syms :type xcb:-ignore)
+ (actionsCount~ :initform
+ '(name actionsCount type xcb:CARD8 size
+ (xcb:-fieldref 'nKeyActions))
+ :type xcb:-list)
+ (actionsCount :initarg :actionsCount :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (actions~ :initform
+ '(name actions type xcb:xkb:Action size
+ (xcb:-fieldref 'totalActions))
+ :type xcb:-list)
+ (actions :initarg :actions :type xcb:-ignore)
+ (behaviors~ :initform
+ '(name behaviors type xcb:xkb:SetBehavior size
+ (xcb:-fieldref 'totalKeyBehaviors))
+ :type xcb:-list)
+ (behaviors :initarg :behaviors :type xcb:-ignore)
+ (vmods~ :initform
+ '(name vmods type xcb:CARD8 size
+ (logcount
+ (xcb:-fieldref 'virtualMods)))
+ :type xcb:-list)
+ (vmods :initarg :vmods :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (explicit~ :initform
+ '(name explicit type xcb:xkb:SetExplicit size
+ (xcb:-fieldref 'totalKeyExplicit))
+ :type xcb:-list)
+ (explicit :initarg :explicit :type xcb:-ignore)
+ (modmap~ :initform
+ '(name modmap type xcb:xkb:KeyModMap size
+ (xcb:-fieldref 'totalModMapKeys))
+ :type xcb:-list)
+ (modmap :initarg :modmap :type xcb:-ignore)
+ (vmodmap~ :initform
+ '(name vmodmap type xcb:xkb:KeyVModMap size
+ (xcb:-fieldref 'totalVModMapKeys))
+ :type xcb:-list)
+ (vmodmap :initarg :vmodmap :type xcb:-ignore)))
+
+(defclass xcb:xkb:GetCompatMap
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (groups :initarg :groups :type xcb:CARD8)
+ (getAllSI :initarg :getAllSI :type xcb:BOOL)
+ (firstSI :initarg :firstSI :type xcb:CARD16)
+ (nSI :initarg :nSI :type xcb:CARD16)))
+(defclass xcb:xkb:GetCompatMap~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (groupsRtrn :initarg :groupsRtrn :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (firstSIRtrn :initarg :firstSIRtrn :type xcb:CARD16)
+ (nSIRtrn :initarg :nSIRtrn :type xcb:CARD16)
+ (nTotalSI :initarg :nTotalSI :type xcb:CARD16)
+ (pad~1 :initform 16 :type xcb:-pad)
+ (si-rtrn~ :initform
+ '(name si-rtrn type xcb:xkb:SymInterpret size
+ (xcb:-fieldref 'nSIRtrn))
+ :type xcb:-list)
+ (si-rtrn :initarg :si-rtrn :type xcb:-ignore)
+ (group-rtrn~ :initform
+ '(name group-rtrn type xcb:xkb:ModDef size
+ (logcount
+ (xcb:-fieldref 'groupsRtrn)))
+ :type xcb:-list)
+ (group-rtrn :initarg :group-rtrn :type xcb:-ignore)))
+
+(defclass xcb:xkb:SetCompatMap
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (recomputeActions :initarg :recomputeActions :type xcb:BOOL)
+ (truncateSI :initarg :truncateSI :type xcb:BOOL)
+ (groups :initarg :groups :type xcb:CARD8)
+ (firstSI :initarg :firstSI :type xcb:CARD16)
+ (nSI :initarg :nSI :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (si~ :initform
+ '(name si type xcb:xkb:SymInterpret size
+ (xcb:-fieldref 'nSI))
+ :type xcb:-list)
+ (si :initarg :si :type xcb:-ignore)
+ (groupMaps~ :initform
+ '(name groupMaps type xcb:xkb:ModDef size
+ (logcount
+ (xcb:-fieldref 'groups)))
+ :type xcb:-list)
+ (groupMaps :initarg :groupMaps :type xcb:-ignore)))
+
+(defclass xcb:xkb:GetIndicatorState
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:xkb:GetIndicatorState~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (state :initarg :state :type xcb:CARD32)
+ (pad~0 :initform 20 :type xcb:-pad)))
+
+(defclass xcb:xkb:GetIndicatorMap
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (which :initarg :which :type xcb:CARD32)))
+(defclass xcb:xkb:GetIndicatorMap~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (which :initarg :which :type xcb:CARD32)
+ (realIndicators :initarg :realIndicators :type xcb:CARD32)
+ (nIndicators :initarg :nIndicators :type xcb:CARD8)
+ (pad~0 :initform 15 :type xcb:-pad)
+ (maps~ :initform
+ '(name maps type xcb:xkb:IndicatorMap size
+ (logcount
+ (xcb:-fieldref 'which)))
+ :type xcb:-list)
+ (maps :initarg :maps :type xcb:-ignore)))
+
+(defclass xcb:xkb:SetIndicatorMap
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (which :initarg :which :type xcb:CARD32)
+ (maps~ :initform
+ '(name maps type xcb:xkb:IndicatorMap size
+ (logcount
+ (xcb:-fieldref 'which)))
+ :type xcb:-list)
+ (maps :initarg :maps :type xcb:-ignore)))
+
+(defclass xcb:xkb:GetNamedIndicator
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (ledClass :initarg :ledClass :type xcb:xkb:LedClassSpec)
+ (ledID :initarg :ledID :type xcb:xkb:IDSpec)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (indicator :initarg :indicator :type xcb:ATOM)))
+(defclass xcb:xkb:GetNamedIndicator~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (indicator :initarg :indicator :type xcb:ATOM)
+ (found :initarg :found :type xcb:BOOL)
+ (on :initarg :on :type xcb:BOOL)
+ (realIndicator :initarg :realIndicator :type xcb:BOOL)
+ (ndx :initarg :ndx :type xcb:CARD8)
+ (map-flags :initarg :map-flags :type xcb:CARD8)
+ (map-whichGroups :initarg :map-whichGroups :type xcb:CARD8)
+ (map-groups :initarg :map-groups :type xcb:CARD8)
+ (map-whichMods :initarg :map-whichMods :type xcb:CARD8)
+ (map-mods :initarg :map-mods :type xcb:CARD8)
+ (map-realMods :initarg :map-realMods :type xcb:CARD8)
+ (map-vmod :initarg :map-vmod :type xcb:CARD16)
+ (map-ctrls :initarg :map-ctrls :type xcb:CARD32)
+ (supported :initarg :supported :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xkb:SetNamedIndicator
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (ledClass :initarg :ledClass :type xcb:xkb:LedClassSpec)
+ (ledID :initarg :ledID :type xcb:xkb:IDSpec)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (indicator :initarg :indicator :type xcb:ATOM)
+ (setState :initarg :setState :type xcb:BOOL)
+ (on :initarg :on :type xcb:BOOL)
+ (setMap :initarg :setMap :type xcb:BOOL)
+ (createMap :initarg :createMap :type xcb:BOOL)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (map-flags :initarg :map-flags :type xcb:CARD8)
+ (map-whichGroups :initarg :map-whichGroups :type xcb:CARD8)
+ (map-groups :initarg :map-groups :type xcb:CARD8)
+ (map-whichMods :initarg :map-whichMods :type xcb:CARD8)
+ (map-realMods :initarg :map-realMods :type xcb:CARD8)
+ (map-vmods :initarg :map-vmods :type xcb:CARD16)
+ (map-ctrls :initarg :map-ctrls :type xcb:CARD32)))
+
+(defclass xcb:xkb:GetNames
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (which :initarg :which :type xcb:CARD32)))
+(defclass xcb:xkb:GetNames~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (which :initarg :which :type xcb:CARD32)
+ (minKeyCode :initarg :minKeyCode :type xcb:KEYCODE)
+ (maxKeyCode :initarg :maxKeyCode :type xcb:KEYCODE)
+ (nTypes :initarg :nTypes :type xcb:CARD8)
+ (groupNames :initarg :groupNames :type xcb:CARD8)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)
+ (firstKey :initarg :firstKey :type xcb:KEYCODE)
+ (nKeys :initarg :nKeys :type xcb:CARD8)
+ (indicators :initarg :indicators :type xcb:CARD32)
+ (nRadioGroups :initarg :nRadioGroups :type xcb:CARD8)
+ (nKeyAliases :initarg :nKeyAliases :type xcb:CARD8)
+ (nKTLevels :initarg :nKTLevels :type xcb:CARD16)
+ (pad~0 :initform 4 :type xcb:-pad)
+ (valueList :initform
+ '(expression
+ (xcb:-fieldref 'which)
+ cases
+ ((1 keycodesName)
+ (2 geometryName)
+ (4 symbolsName)
+ (8 physSymbolsName)
+ (16 typesName)
+ (32 compatName)
+ (64 typeNames~)
+ (128 nLevelsPerType~ pad~1 ktLevelNames~)
+ (256 indicatorNames~)
+ (2048 virtualModNames~)
+ (4096 groups~)
+ (512 keyNames~)
+ (1024 keyAliases~)
+ (8192 radioGroupNames~)))
+ :type xcb:-switch)
+ (keycodesName :initarg :keycodesName :type xcb:ATOM)
+ (geometryName :initarg :geometryName :type xcb:ATOM)
+ (symbolsName :initarg :symbolsName :type xcb:ATOM)
+ (physSymbolsName :initarg :physSymbolsName :type xcb:ATOM)
+ (typesName :initarg :typesName :type xcb:ATOM)
+ (compatName :initarg :compatName :type xcb:ATOM)
+ (typeNames~ :initform
+ '(name typeNames type xcb:ATOM size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (typeNames :initarg :typeNames :type xcb:-ignore)
+ (nLevelsPerType~ :initform
+ '(name nLevelsPerType type xcb:CARD8 size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (nLevelsPerType :initarg :nLevelsPerType :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (ktLevelNames~ :initform
+ '(name ktLevelNames type xcb:ATOM size
+ (apply #'+
+ (slot-value obj 'nLevelsPerType)))
+ :type xcb:-list)
+ (ktLevelNames :initarg :ktLevelNames :type xcb:-ignore)
+ (indicatorNames~ :initform
+ '(name indicatorNames type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'indicators)))
+ :type xcb:-list)
+ (indicatorNames :initarg :indicatorNames :type xcb:-ignore)
+ (virtualModNames~ :initform
+ '(name virtualModNames type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'virtualMods)))
+ :type xcb:-list)
+ (virtualModNames :initarg :virtualModNames :type xcb:-ignore)
+ (groups~ :initform
+ '(name groups type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'groupNames)))
+ :type xcb:-list)
+ (groups :initarg :groups :type xcb:-ignore)
+ (keyNames~ :initform
+ '(name keyNames type xcb:xkb:KeyName size
+ (xcb:-fieldref 'nKeys))
+ :type xcb:-list)
+ (keyNames :initarg :keyNames :type xcb:-ignore)
+ (keyAliases~ :initform
+ '(name keyAliases type xcb:xkb:KeyAlias size
+ (xcb:-fieldref 'nKeyAliases))
+ :type xcb:-list)
+ (keyAliases :initarg :keyAliases :type xcb:-ignore)
+ (radioGroupNames~ :initform
+ '(name radioGroupNames type xcb:ATOM size
+ (xcb:-fieldref 'nRadioGroups))
+ :type xcb:-list)
+ (radioGroupNames :initarg :radioGroupNames :type xcb:-ignore)))
+
+(defclass xcb:xkb:SetNames
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)
+ (which :initarg :which :type xcb:CARD32)
+ (firstType :initarg :firstType :type xcb:CARD8)
+ (nTypes :initarg :nTypes :type xcb:CARD8)
+ (firstKTLevelt :initarg :firstKTLevelt :type xcb:CARD8)
+ (nKTLevels :initarg :nKTLevels :type xcb:CARD8)
+ (indicators :initarg :indicators :type xcb:CARD32)
+ (groupNames :initarg :groupNames :type xcb:CARD8)
+ (nRadioGroups :initarg :nRadioGroups :type xcb:CARD8)
+ (firstKey :initarg :firstKey :type xcb:KEYCODE)
+ (nKeys :initarg :nKeys :type xcb:CARD8)
+ (nKeyAliases :initarg :nKeyAliases :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (totalKTLevelNames :initarg :totalKTLevelNames :type xcb:CARD16)
+ (values :initform
+ '(expression
+ (xcb:-fieldref 'which)
+ cases
+ ((1 keycodesName)
+ (2 geometryName)
+ (4 symbolsName)
+ (8 physSymbolsName)
+ (16 typesName)
+ (32 compatName)
+ (64 typeNames~)
+ (128 nLevelsPerType~ pad~1 ktLevelNames~)
+ (256 indicatorNames~)
+ (2048 virtualModNames~)
+ (4096 groups~)
+ (512 keyNames~)
+ (1024 keyAliases~)
+ (8192 radioGroupNames~)))
+ :type xcb:-switch)
+ (keycodesName :initarg :keycodesName :type xcb:ATOM)
+ (geometryName :initarg :geometryName :type xcb:ATOM)
+ (symbolsName :initarg :symbolsName :type xcb:ATOM)
+ (physSymbolsName :initarg :physSymbolsName :type xcb:ATOM)
+ (typesName :initarg :typesName :type xcb:ATOM)
+ (compatName :initarg :compatName :type xcb:ATOM)
+ (typeNames~ :initform
+ '(name typeNames type xcb:ATOM size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (typeNames :initarg :typeNames :type xcb:-ignore)
+ (nLevelsPerType~ :initform
+ '(name nLevelsPerType type xcb:CARD8 size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (nLevelsPerType :initarg :nLevelsPerType :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (ktLevelNames~ :initform
+ '(name ktLevelNames type xcb:ATOM size
+ (apply #'+
+ (slot-value obj 'nLevelsPerType)))
+ :type xcb:-list)
+ (ktLevelNames :initarg :ktLevelNames :type xcb:-ignore)
+ (indicatorNames~ :initform
+ '(name indicatorNames type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'indicators)))
+ :type xcb:-list)
+ (indicatorNames :initarg :indicatorNames :type xcb:-ignore)
+ (virtualModNames~ :initform
+ '(name virtualModNames type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'virtualMods)))
+ :type xcb:-list)
+ (virtualModNames :initarg :virtualModNames :type xcb:-ignore)
+ (groups~ :initform
+ '(name groups type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'groupNames)))
+ :type xcb:-list)
+ (groups :initarg :groups :type xcb:-ignore)
+ (keyNames~ :initform
+ '(name keyNames type xcb:xkb:KeyName size
+ (xcb:-fieldref 'nKeys))
+ :type xcb:-list)
+ (keyNames :initarg :keyNames :type xcb:-ignore)
+ (keyAliases~ :initform
+ '(name keyAliases type xcb:xkb:KeyAlias size
+ (xcb:-fieldref 'nKeyAliases))
+ :type xcb:-list)
+ (keyAliases :initarg :keyAliases :type xcb:-ignore)
+ (radioGroupNames~ :initform
+ '(name radioGroupNames type xcb:ATOM size
+ (xcb:-fieldref 'nRadioGroups))
+ :type xcb:-list)
+ (radioGroupNames :initarg :radioGroupNames :type xcb:-ignore)))
+
+(defclass xcb:xkb:PerClientFlags
+ (xcb:-request)
+ ((~opcode :initform 21 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (change :initarg :change :type xcb:CARD32)
+ (value :initarg :value :type xcb:CARD32)
+ (ctrlsToChange :initarg :ctrlsToChange :type xcb:CARD32)
+ (autoCtrls :initarg :autoCtrls :type xcb:CARD32)
+ (autoCtrlsValues :initarg :autoCtrlsValues :type xcb:CARD32)))
+(defclass xcb:xkb:PerClientFlags~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (supported :initarg :supported :type xcb:CARD32)
+ (value :initarg :value :type xcb:CARD32)
+ (autoCtrls :initarg :autoCtrls :type xcb:CARD32)
+ (autoCtrlsValues :initarg :autoCtrlsValues :type xcb:CARD32)
+ (pad~0 :initform 8 :type xcb:-pad)))
+
+(defclass xcb:xkb:ListComponents
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (maxNames :initarg :maxNames :type xcb:CARD16)))
+(defclass xcb:xkb:ListComponents~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (nKeymaps :initarg :nKeymaps :type xcb:CARD16)
+ (nKeycodes :initarg :nKeycodes :type xcb:CARD16)
+ (nTypes :initarg :nTypes :type xcb:CARD16)
+ (nCompatMaps :initarg :nCompatMaps :type xcb:CARD16)
+ (nSymbols :initarg :nSymbols :type xcb:CARD16)
+ (nGeometries :initarg :nGeometries :type xcb:CARD16)
+ (extra :initarg :extra :type xcb:CARD16)
+ (pad~0 :initform 10 :type xcb:-pad)
+ (keymaps~ :initform
+ '(name keymaps type xcb:xkb:Listing size
+ (xcb:-fieldref 'nKeymaps))
+ :type xcb:-list)
+ (keymaps :initarg :keymaps :type xcb:-ignore)
+ (keycodes~ :initform
+ '(name keycodes type xcb:xkb:Listing size
+ (xcb:-fieldref 'nKeycodes))
+ :type xcb:-list)
+ (keycodes :initarg :keycodes :type xcb:-ignore)
+ (types~ :initform
+ '(name types type xcb:xkb:Listing size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (types :initarg :types :type xcb:-ignore)
+ (compatMaps~ :initform
+ '(name compatMaps type xcb:xkb:Listing size
+ (xcb:-fieldref 'nCompatMaps))
+ :type xcb:-list)
+ (compatMaps :initarg :compatMaps :type xcb:-ignore)
+ (symbols~ :initform
+ '(name symbols type xcb:xkb:Listing size
+ (xcb:-fieldref 'nSymbols))
+ :type xcb:-list)
+ (symbols :initarg :symbols :type xcb:-ignore)
+ (geometries~ :initform
+ '(name geometries type xcb:xkb:Listing size
+ (xcb:-fieldref 'nGeometries))
+ :type xcb:-list)
+ (geometries :initarg :geometries :type xcb:-ignore)))
+
+(defclass xcb:xkb:GetKbdByName
+ (xcb:-request)
+ ((~opcode :initform 23 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (need :initarg :need :type xcb:CARD16)
+ (want :initarg :want :type xcb:CARD16)
+ (load :initarg :load :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)))
+(defclass xcb:xkb:GetKbdByName~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (minKeyCode :initarg :minKeyCode :type xcb:KEYCODE)
+ (maxKeyCode :initarg :maxKeyCode :type xcb:KEYCODE)
+ (loaded :initarg :loaded :type xcb:BOOL)
+ (newKeyboard :initarg :newKeyboard :type xcb:BOOL)
+ (found :initarg :found :type xcb:CARD16)
+ (reported :initarg :reported :type xcb:CARD16)
+ (pad~0 :initform 16 :type xcb:-pad)
+ (replies :initform
+ '(expression
+ (xcb:-fieldref 'reported)
+ cases
+ ((13 getmap-type typeDeviceID getmap-sequence getmap-length pad~1 typeMinKeyCode typeMaxKeyCode present firstType nTypes totalTypes firstKeySym totalSyms nKeySyms firstKeyAction totalActions nKeyActions firstKeyBehavior nKeyBehaviors totalKeyBehaviors firstKeyExplicit nKeyExplicit totalKeyExplicit firstModMapKey nModMapKeys totalModMapKeys firstVModMapKey nVModMapKeys totalVModMapKeys pad~2 virtualMods map)
+ (2 compatmap-type compatDeviceID compatmap-sequence compatmap-length groupsRtrn pad~7 firstSIRtrn nSIRtrn nTotalSI pad~8 si-rtrn~ group-rtrn~)
+ (16 indicatormap-type indicatorDeviceID indicatormap-sequence indicatormap-length which realIndicators nIndicators pad~9 maps~)
+ (160 keyname-type keyDeviceID keyname-sequence keyname-length which* keyMinKeyCode keyMaxKeyCode nTypes* groupNames virtualMods* firstKey nKeys indicators nRadioGroups nKeyAliases nKTLevels pad~10 valueList)
+ (64 geometry-type geometryDeviceID geometry-sequence geometry-length name geometryFound pad~12 widthMM heightMM nProperties nColors nShapes nSections nDoodads nKeyAliases* baseColorNdx labelColorNdx labelFont)))
+ :type xcb:-switch)
+ (getmap-type :initarg :getmap-type :type xcb:CARD8)
+ (typeDeviceID :initarg :typeDeviceID :type xcb:CARD8)
+ (getmap-sequence :initarg :getmap-sequence :type xcb:CARD16)
+ (getmap-length :initarg :getmap-length :type xcb:CARD32)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (typeMinKeyCode :initarg :typeMinKeyCode :type xcb:KEYCODE)
+ (typeMaxKeyCode :initarg :typeMaxKeyCode :type xcb:KEYCODE)
+ (present :initarg :present :type xcb:CARD16)
+ (firstType :initarg :firstType :type xcb:CARD8)
+ (nTypes :initarg :nTypes :type xcb:CARD8)
+ (totalTypes :initarg :totalTypes :type xcb:CARD8)
+ (firstKeySym :initarg :firstKeySym :type xcb:KEYCODE)
+ (totalSyms :initarg :totalSyms :type xcb:CARD16)
+ (nKeySyms :initarg :nKeySyms :type xcb:CARD8)
+ (firstKeyAction :initarg :firstKeyAction :type xcb:KEYCODE)
+ (totalActions :initarg :totalActions :type xcb:CARD16)
+ (nKeyActions :initarg :nKeyActions :type xcb:CARD8)
+ (firstKeyBehavior :initarg :firstKeyBehavior :type xcb:KEYCODE)
+ (nKeyBehaviors :initarg :nKeyBehaviors :type xcb:CARD8)
+ (totalKeyBehaviors :initarg :totalKeyBehaviors :type xcb:CARD8)
+ (firstKeyExplicit :initarg :firstKeyExplicit :type xcb:KEYCODE)
+ (nKeyExplicit :initarg :nKeyExplicit :type xcb:CARD8)
+ (totalKeyExplicit :initarg :totalKeyExplicit :type xcb:CARD8)
+ (firstModMapKey :initarg :firstModMapKey :type xcb:KEYCODE)
+ (nModMapKeys :initarg :nModMapKeys :type xcb:CARD8)
+ (totalModMapKeys :initarg :totalModMapKeys :type xcb:CARD8)
+ (firstVModMapKey :initarg :firstVModMapKey :type xcb:KEYCODE)
+ (nVModMapKeys :initarg :nVModMapKeys :type xcb:CARD8)
+ (totalVModMapKeys :initarg :totalVModMapKeys :type xcb:CARD8)
+ (pad~2 :initform 1 :type xcb:-pad)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)
+ (map :initform
+ '(expression
+ (xcb:-fieldref 'present)
+ cases
+ ((1 types-rtrn~)
+ (2 syms-rtrn~)
+ (16 acts-rtrn-count~ pad~3 acts-rtrn-acts~)
+ (32 behaviors-rtrn~)
+ (64 vmods-rtrn~ pad~4)
+ (8 explicit-rtrn~ pad~5)
+ (4 modmap-rtrn~ pad~6)
+ (128 vmodmap-rtrn~)))
+ :type xcb:-switch)
+ (types-rtrn~ :initform
+ '(name types-rtrn type xcb:xkb:KeyType size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (types-rtrn :initarg :types-rtrn :type xcb:-ignore)
+ (syms-rtrn~ :initform
+ '(name syms-rtrn type xcb:xkb:KeySymMap size
+ (xcb:-fieldref 'nKeySyms))
+ :type xcb:-list)
+ (syms-rtrn :initarg :syms-rtrn :type xcb:-ignore)
+ (acts-rtrn-count~ :initform
+ '(name acts-rtrn-count type xcb:CARD8 size
+ (xcb:-fieldref 'nKeyActions))
+ :type xcb:-list)
+ (acts-rtrn-count :initarg :acts-rtrn-count :type xcb:-ignore)
+ (pad~3 :initform 4 :type xcb:-pad-align)
+ (acts-rtrn-acts~ :initform
+ '(name acts-rtrn-acts type xcb:xkb:Action size
+ (xcb:-fieldref 'totalActions))
+ :type xcb:-list)
+ (acts-rtrn-acts :initarg :acts-rtrn-acts :type xcb:-ignore)
+ (behaviors-rtrn~ :initform
+ '(name behaviors-rtrn type xcb:xkb:SetBehavior size
+ (xcb:-fieldref 'totalKeyBehaviors))
+ :type xcb:-list)
+ (behaviors-rtrn :initarg :behaviors-rtrn :type xcb:-ignore)
+ (vmods-rtrn~ :initform
+ '(name vmods-rtrn type xcb:CARD8 size
+ (logcount
+ (xcb:-fieldref 'virtualMods)))
+ :type xcb:-list)
+ (vmods-rtrn :initarg :vmods-rtrn :type xcb:-ignore)
+ (pad~4 :initform 4 :type xcb:-pad-align)
+ (explicit-rtrn~ :initform
+ '(name explicit-rtrn type xcb:xkb:SetExplicit size
+ (xcb:-fieldref 'totalKeyExplicit))
+ :type xcb:-list)
+ (explicit-rtrn :initarg :explicit-rtrn :type xcb:-ignore)
+ (pad~5 :initform 4 :type xcb:-pad-align)
+ (modmap-rtrn~ :initform
+ '(name modmap-rtrn type xcb:xkb:KeyModMap size
+ (xcb:-fieldref 'totalModMapKeys))
+ :type xcb:-list)
+ (modmap-rtrn :initarg :modmap-rtrn :type xcb:-ignore)
+ (pad~6 :initform 4 :type xcb:-pad-align)
+ (vmodmap-rtrn~ :initform
+ '(name vmodmap-rtrn type xcb:xkb:KeyVModMap size
+ (xcb:-fieldref 'totalVModMapKeys))
+ :type xcb:-list)
+ (vmodmap-rtrn :initarg :vmodmap-rtrn :type xcb:-ignore)
+ (compatmap-type :initarg :compatmap-type :type xcb:CARD8)
+ (compatDeviceID :initarg :compatDeviceID :type xcb:CARD8)
+ (compatmap-sequence :initarg :compatmap-sequence :type xcb:CARD16)
+ (compatmap-length :initarg :compatmap-length :type xcb:CARD32)
+ (groupsRtrn :initarg :groupsRtrn :type xcb:CARD8)
+ (pad~7 :initform 1 :type xcb:-pad)
+ (firstSIRtrn :initarg :firstSIRtrn :type xcb:CARD16)
+ (nSIRtrn :initarg :nSIRtrn :type xcb:CARD16)
+ (nTotalSI :initarg :nTotalSI :type xcb:CARD16)
+ (pad~8 :initform 16 :type xcb:-pad)
+ (si-rtrn~ :initform
+ '(name si-rtrn type xcb:xkb:SymInterpret size
+ (xcb:-fieldref 'nSIRtrn))
+ :type xcb:-list)
+ (si-rtrn :initarg :si-rtrn :type xcb:-ignore)
+ (group-rtrn~ :initform
+ '(name group-rtrn type xcb:xkb:ModDef size
+ (logcount
+ (xcb:-fieldref 'groupsRtrn)))
+ :type xcb:-list)
+ (group-rtrn :initarg :group-rtrn :type xcb:-ignore)
+ (indicatormap-type :initarg :indicatormap-type :type xcb:CARD8)
+ (indicatorDeviceID :initarg :indicatorDeviceID :type xcb:CARD8)
+ (indicatormap-sequence :initarg :indicatormap-sequence :type xcb:CARD16)
+ (indicatormap-length :initarg :indicatormap-length :type xcb:CARD32)
+ (which :initarg :which :type xcb:CARD32)
+ (realIndicators :initarg :realIndicators :type xcb:CARD32)
+ (nIndicators :initarg :nIndicators :type xcb:CARD8)
+ (pad~9 :initform 15 :type xcb:-pad)
+ (maps~ :initform
+ '(name maps type xcb:xkb:IndicatorMap size
+ (xcb:-fieldref 'nIndicators))
+ :type xcb:-list)
+ (maps :initarg :maps :type xcb:-ignore)
+ (keyname-type :initarg :keyname-type :type xcb:CARD8)
+ (keyDeviceID :initarg :keyDeviceID :type xcb:CARD8)
+ (keyname-sequence :initarg :keyname-sequence :type xcb:CARD16)
+ (keyname-length :initarg :keyname-length :type xcb:CARD32)
+ (which* :initarg :which* :type xcb:CARD32)
+ (keyMinKeyCode :initarg :keyMinKeyCode :type xcb:KEYCODE)
+ (keyMaxKeyCode :initarg :keyMaxKeyCode :type xcb:KEYCODE)
+ (nTypes* :initarg :nTypes* :type xcb:CARD8)
+ (groupNames :initarg :groupNames :type xcb:CARD8)
+ (virtualMods* :initarg :virtualMods* :type xcb:CARD16)
+ (firstKey :initarg :firstKey :type xcb:KEYCODE)
+ (nKeys :initarg :nKeys :type xcb:CARD8)
+ (indicators :initarg :indicators :type xcb:CARD32)
+ (nRadioGroups :initarg :nRadioGroups :type xcb:CARD8)
+ (nKeyAliases :initarg :nKeyAliases :type xcb:CARD8)
+ (nKTLevels :initarg :nKTLevels :type xcb:CARD16)
+ (pad~10 :initform 4 :type xcb:-pad)
+ (valueList :initform
+ '(expression
+ (xcb:-fieldref 'which)
+ cases
+ ((1 keycodesName)
+ (2 geometryName)
+ (4 symbolsName)
+ (8 physSymbolsName)
+ (16 typesName)
+ (32 compatName)
+ (64 typeNames~)
+ (128 nLevelsPerType~ pad~11 ktLevelNames~)
+ (256 indicatorNames~)
+ (2048 virtualModNames~)
+ (4096 groups~)
+ (512 keyNames~)
+ (1024 keyAliases~)
+ (8192 radioGroupNames~)))
+ :type xcb:-switch)
+ (keycodesName :initarg :keycodesName :type xcb:ATOM)
+ (geometryName :initarg :geometryName :type xcb:ATOM)
+ (symbolsName :initarg :symbolsName :type xcb:ATOM)
+ (physSymbolsName :initarg :physSymbolsName :type xcb:ATOM)
+ (typesName :initarg :typesName :type xcb:ATOM)
+ (compatName :initarg :compatName :type xcb:ATOM)
+ (typeNames~ :initform
+ '(name typeNames type xcb:ATOM size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (typeNames :initarg :typeNames :type xcb:-ignore)
+ (nLevelsPerType~ :initform
+ '(name nLevelsPerType type xcb:CARD8 size
+ (xcb:-fieldref 'nTypes))
+ :type xcb:-list)
+ (nLevelsPerType :initarg :nLevelsPerType :type xcb:-ignore)
+ (pad~11 :initform 4 :type xcb:-pad-align)
+ (ktLevelNames~ :initform
+ '(name ktLevelNames type xcb:ATOM size
+ (apply #'+
+ (slot-value obj 'nLevelsPerType)))
+ :type xcb:-list)
+ (ktLevelNames :initarg :ktLevelNames :type xcb:-ignore)
+ (indicatorNames~ :initform
+ '(name indicatorNames type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'indicators)))
+ :type xcb:-list)
+ (indicatorNames :initarg :indicatorNames :type xcb:-ignore)
+ (virtualModNames~ :initform
+ '(name virtualModNames type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'virtualMods)))
+ :type xcb:-list)
+ (virtualModNames :initarg :virtualModNames :type xcb:-ignore)
+ (groups~ :initform
+ '(name groups type xcb:ATOM size
+ (logcount
+ (xcb:-fieldref 'groupNames)))
+ :type xcb:-list)
+ (groups :initarg :groups :type xcb:-ignore)
+ (keyNames~ :initform
+ '(name keyNames type xcb:xkb:KeyName size
+ (xcb:-fieldref 'nKeys))
+ :type xcb:-list)
+ (keyNames :initarg :keyNames :type xcb:-ignore)
+ (keyAliases~ :initform
+ '(name keyAliases type xcb:xkb:KeyAlias size
+ (xcb:-fieldref 'nKeyAliases))
+ :type xcb:-list)
+ (keyAliases :initarg :keyAliases :type xcb:-ignore)
+ (radioGroupNames~ :initform
+ '(name radioGroupNames type xcb:ATOM size
+ (xcb:-fieldref 'nRadioGroups))
+ :type xcb:-list)
+ (radioGroupNames :initarg :radioGroupNames :type xcb:-ignore)
+ (geometry-type :initarg :geometry-type :type xcb:CARD8)
+ (geometryDeviceID :initarg :geometryDeviceID :type xcb:CARD8)
+ (geometry-sequence :initarg :geometry-sequence :type xcb:CARD16)
+ (geometry-length :initarg :geometry-length :type xcb:CARD32)
+ (name :initarg :name :type xcb:ATOM)
+ (geometryFound :initarg :geometryFound :type xcb:BOOL)
+ (pad~12 :initform 1 :type xcb:-pad)
+ (widthMM :initarg :widthMM :type xcb:CARD16)
+ (heightMM :initarg :heightMM :type xcb:CARD16)
+ (nProperties :initarg :nProperties :type xcb:CARD16)
+ (nColors :initarg :nColors :type xcb:CARD16)
+ (nShapes :initarg :nShapes :type xcb:CARD16)
+ (nSections :initarg :nSections :type xcb:CARD16)
+ (nDoodads :initarg :nDoodads :type xcb:CARD16)
+ (nKeyAliases* :initarg :nKeyAliases* :type xcb:CARD16)
+ (baseColorNdx :initarg :baseColorNdx :type xcb:CARD8)
+ (labelColorNdx :initarg :labelColorNdx :type xcb:CARD8)
+ (labelFont :initarg :labelFont :type xcb:xkb:CountedString16)))
+
+(defclass xcb:xkb:GetDeviceInfo
+ (xcb:-request)
+ ((~opcode :initform 24 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (wanted :initarg :wanted :type xcb:CARD16)
+ (allButtons :initarg :allButtons :type xcb:BOOL)
+ (firstButton :initarg :firstButton :type xcb:CARD8)
+ (nButtons :initarg :nButtons :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (ledClass :initarg :ledClass :type xcb:xkb:LedClassSpec)
+ (ledID :initarg :ledID :type xcb:xkb:IDSpec)))
+(defclass xcb:xkb:GetDeviceInfo~reply
+ (xcb:-reply)
+ ((deviceID :initarg :deviceID :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (present :initarg :present :type xcb:CARD16)
+ (supported :initarg :supported :type xcb:CARD16)
+ (unsupported :initarg :unsupported :type xcb:CARD16)
+ (nDeviceLedFBs :initarg :nDeviceLedFBs :type xcb:CARD16)
+ (firstBtnWanted :initarg :firstBtnWanted :type xcb:CARD8)
+ (nBtnsWanted :initarg :nBtnsWanted :type xcb:CARD8)
+ (firstBtnRtrn :initarg :firstBtnRtrn :type xcb:CARD8)
+ (nBtnsRtrn :initarg :nBtnsRtrn :type xcb:CARD8)
+ (totalBtns :initarg :totalBtns :type xcb:CARD8)
+ (hasOwnState :initarg :hasOwnState :type xcb:BOOL)
+ (dfltKbdFB :initarg :dfltKbdFB :type xcb:CARD16)
+ (dfltLedFB :initarg :dfltLedFB :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (devType :initarg :devType :type xcb:ATOM)
+ (nameLen :initarg :nameLen :type xcb:CARD16)
+ (name~ :initform
+ '(name name type xcb:xkb:STRING8 size
+ (xcb:-fieldref 'nameLen))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (btnActions~ :initform
+ '(name btnActions type xcb:xkb:Action size
+ (xcb:-fieldref 'nBtnsRtrn))
+ :type xcb:-list)
+ (btnActions :initarg :btnActions :type xcb:-ignore)
+ (leds~ :initform
+ '(name leds type xcb:xkb:DeviceLedInfo size
+ (xcb:-fieldref 'nDeviceLedFBs))
+ :type xcb:-list)
+ (leds :initarg :leds :type xcb:-ignore)))
+
+(defclass xcb:xkb:SetDeviceInfo
+ (xcb:-request)
+ ((~opcode :initform 25 :type xcb:-u1)
+ (deviceSpec :initarg :deviceSpec :type xcb:xkb:DeviceSpec)
+ (firstBtn :initarg :firstBtn :type xcb:CARD8)
+ (nBtns :initarg :nBtns :type xcb:CARD8)
+ (change :initarg :change :type xcb:CARD16)
+ (nDeviceLedFBs :initarg :nDeviceLedFBs :type xcb:CARD16)
+ (btnActions~ :initform
+ '(name btnActions type xcb:xkb:Action size
+ (xcb:-fieldref 'nBtns))
+ :type xcb:-list)
+ (btnActions :initarg :btnActions :type xcb:-ignore)
+ (leds~ :initform
+ '(name leds type xcb:xkb:DeviceLedInfo size
+ (xcb:-fieldref 'nDeviceLedFBs))
+ :type xcb:-list)
+ (leds :initarg :leds :type xcb:-ignore)))
+
+(defclass xcb:xkb:SetDebuggingFlags
+ (xcb:-request)
+ ((~opcode :initform 101 :type xcb:-u1)
+ (msgLength :initarg :msgLength :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (affectFlags :initarg :affectFlags :type xcb:CARD32)
+ (flags :initarg :flags :type xcb:CARD32)
+ (affectCtrls :initarg :affectCtrls :type xcb:CARD32)
+ (ctrls :initarg :ctrls :type xcb:CARD32)
+ (message~ :initform
+ '(name message type xcb:xkb:STRING8 size
+ (xcb:-fieldref 'msgLength))
+ :type xcb:-list)
+ (message :initarg :message :type xcb:-ignore)))
+(defclass xcb:xkb:SetDebuggingFlags~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (currentFlags :initarg :currentFlags :type xcb:CARD32)
+ (currentCtrls :initarg :currentCtrls :type xcb:CARD32)
+ (supportedFlags :initarg :supportedFlags :type xcb:CARD32)
+ (supportedCtrls :initarg :supportedCtrls :type xcb:CARD32)
+ (pad~1 :initform 8 :type xcb:-pad)))
+
+(defclass xcb:xkb:NewKeyboardNotify
+ (xcb:-event)
+ ((~code :initform 0)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (oldDeviceID :initarg :oldDeviceID :type xcb:CARD8)
+ (minKeyCode :initarg :minKeyCode :type xcb:KEYCODE)
+ (maxKeyCode :initarg :maxKeyCode :type xcb:KEYCODE)
+ (oldMinKeyCode :initarg :oldMinKeyCode :type xcb:KEYCODE)
+ (oldMaxKeyCode :initarg :oldMaxKeyCode :type xcb:KEYCODE)
+ (requestMajor :initarg :requestMajor :type xcb:CARD8)
+ (requestMinor :initarg :requestMinor :type xcb:CARD8)
+ (changed :initarg :changed :type xcb:CARD16)
+ (pad~0 :initform 14 :type xcb:-pad)))
+
+(defclass xcb:xkb:MapNotify
+ (xcb:-event)
+ ((~code :initform 1)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (ptrBtnActions :initarg :ptrBtnActions :type xcb:CARD8)
+ (changed :initarg :changed :type xcb:CARD16)
+ (minKeyCode :initarg :minKeyCode :type xcb:KEYCODE)
+ (maxKeyCode :initarg :maxKeyCode :type xcb:KEYCODE)
+ (firstType :initarg :firstType :type xcb:CARD8)
+ (nTypes :initarg :nTypes :type xcb:CARD8)
+ (firstKeySym :initarg :firstKeySym :type xcb:KEYCODE)
+ (nKeySyms :initarg :nKeySyms :type xcb:CARD8)
+ (firstKeyAct :initarg :firstKeyAct :type xcb:KEYCODE)
+ (nKeyActs :initarg :nKeyActs :type xcb:CARD8)
+ (firstKeyBehavior :initarg :firstKeyBehavior :type xcb:KEYCODE)
+ (nKeyBehavior :initarg :nKeyBehavior :type xcb:CARD8)
+ (firstKeyExplicit :initarg :firstKeyExplicit :type xcb:KEYCODE)
+ (nKeyExplicit :initarg :nKeyExplicit :type xcb:CARD8)
+ (firstModMapKey :initarg :firstModMapKey :type xcb:KEYCODE)
+ (nModMapKeys :initarg :nModMapKeys :type xcb:CARD8)
+ (firstVModMapKey :initarg :firstVModMapKey :type xcb:KEYCODE)
+ (nVModMapKeys :initarg :nVModMapKeys :type xcb:CARD8)
+ (virtualMods :initarg :virtualMods :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:xkb:StateNotify
+ (xcb:-event)
+ ((~code :initform 2)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (mods :initarg :mods :type xcb:CARD8)
+ (baseMods :initarg :baseMods :type xcb:CARD8)
+ (latchedMods :initarg :latchedMods :type xcb:CARD8)
+ (lockedMods :initarg :lockedMods :type xcb:CARD8)
+ (group :initarg :group :type xcb:CARD8)
+ (baseGroup :initarg :baseGroup :type xcb:INT16)
+ (latchedGroup :initarg :latchedGroup :type xcb:INT16)
+ (lockedGroup :initarg :lockedGroup :type xcb:CARD8)
+ (compatState :initarg :compatState :type xcb:CARD8)
+ (grabMods :initarg :grabMods :type xcb:CARD8)
+ (compatGrabMods :initarg :compatGrabMods :type xcb:CARD8)
+ (lookupMods :initarg :lookupMods :type xcb:CARD8)
+ (compatLoockupMods :initarg :compatLoockupMods :type xcb:CARD8)
+ (ptrBtnState :initarg :ptrBtnState :type xcb:CARD16)
+ (changed :initarg :changed :type xcb:CARD16)
+ (keycode :initarg :keycode :type xcb:KEYCODE)
+ (eventType :initarg :eventType :type xcb:CARD8)
+ (requestMajor :initarg :requestMajor :type xcb:CARD8)
+ (requestMinor :initarg :requestMinor :type xcb:CARD8)))
+
+(defclass xcb:xkb:ControlsNotify
+ (xcb:-event)
+ ((~code :initform 3)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (numGroups :initarg :numGroups :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (changedControls :initarg :changedControls :type xcb:CARD32)
+ (enabledControls :initarg :enabledControls :type xcb:CARD32)
+ (enabledControlChanges :initarg :enabledControlChanges :type xcb:CARD32)
+ (keycode :initarg :keycode :type xcb:KEYCODE)
+ (eventType :initarg :eventType :type xcb:CARD8)
+ (requestMajor :initarg :requestMajor :type xcb:CARD8)
+ (requestMinor :initarg :requestMinor :type xcb:CARD8)
+ (pad~1 :initform 4 :type xcb:-pad)))
+
+(defclass xcb:xkb:IndicatorStateNotify
+ (xcb:-event)
+ ((~code :initform 4)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (state :initarg :state :type xcb:CARD32)
+ (stateChanged :initarg :stateChanged :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)))
+
+(defclass xcb:xkb:IndicatorMapNotify
+ (xcb:-event)
+ ((~code :initform 5)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (state :initarg :state :type xcb:CARD32)
+ (mapChanged :initarg :mapChanged :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)))
+
+(defclass xcb:xkb:NamesNotify
+ (xcb:-event)
+ ((~code :initform 6)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (changed :initarg :changed :type xcb:CARD16)
+ (firstType :initarg :firstType :type xcb:CARD8)
+ (nTypes :initarg :nTypes :type xcb:CARD8)
+ (firstLevelName :initarg :firstLevelName :type xcb:CARD8)
+ (nLevelNames :initarg :nLevelNames :type xcb:CARD8)
+ (pad~1 :initform 1 :type xcb:-pad)
+ (nRadioGroups :initarg :nRadioGroups :type xcb:CARD8)
+ (nKeyAliases :initarg :nKeyAliases :type xcb:CARD8)
+ (changedGroupNames :initarg :changedGroupNames :type xcb:CARD8)
+ (changedVirtualMods :initarg :changedVirtualMods :type xcb:CARD16)
+ (firstKey :initarg :firstKey :type xcb:KEYCODE)
+ (nKeys :initarg :nKeys :type xcb:CARD8)
+ (changedIndicators :initarg :changedIndicators :type xcb:CARD32)
+ (pad~2 :initform 4 :type xcb:-pad)))
+
+(defclass xcb:xkb:CompatMapNotify
+ (xcb:-event)
+ ((~code :initform 7)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (changedGroups :initarg :changedGroups :type xcb:CARD8)
+ (firstSI :initarg :firstSI :type xcb:CARD16)
+ (nSI :initarg :nSI :type xcb:CARD16)
+ (nTotalSI :initarg :nTotalSI :type xcb:CARD16)
+ (pad~0 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:xkb:BellNotify
+ (xcb:-event)
+ ((~code :initform 8)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (bellClass :initarg :bellClass :type xcb:CARD8)
+ (bellID :initarg :bellID :type xcb:CARD8)
+ (percent :initarg :percent :type xcb:CARD8)
+ (pitch :initarg :pitch :type xcb:CARD16)
+ (duration :initarg :duration :type xcb:CARD16)
+ (name :initarg :name :type xcb:ATOM)
+ (window :initarg :window :type xcb:WINDOW)
+ (eventOnly :initarg :eventOnly :type xcb:BOOL)
+ (pad~0 :initform 7 :type xcb:-pad)))
+
+(defclass xcb:xkb:ActionMessage
+ (xcb:-event)
+ ((~code :initform 9)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (keycode :initarg :keycode :type xcb:KEYCODE)
+ (press :initarg :press :type xcb:BOOL)
+ (keyEventFollows :initarg :keyEventFollows :type xcb:BOOL)
+ (mods :initarg :mods :type xcb:CARD8)
+ (group :initarg :group :type xcb:CARD8)
+ (message~ :initform
+ '(name message type xcb:xkb:STRING8 size 8)
+ :type xcb:-list)
+ (message :initarg :message :type xcb:-ignore)
+ (pad~0 :initform 10 :type xcb:-pad)))
+
+(defclass xcb:xkb:AccessXNotify
+ (xcb:-event)
+ ((~code :initform 10)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (keycode :initarg :keycode :type xcb:KEYCODE)
+ (detailt :initarg :detailt :type xcb:CARD16)
+ (slowKeysDelay :initarg :slowKeysDelay :type xcb:CARD16)
+ (debounceDelay :initarg :debounceDelay :type xcb:CARD16)
+ (pad~0 :initform 16 :type xcb:-pad)))
+
+(defclass xcb:xkb:ExtensionDeviceNotify
+ (xcb:-event)
+ ((~code :initform 11)
+ (xkbType :initarg :xkbType :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (deviceID :initarg :deviceID :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (reason :initarg :reason :type xcb:CARD16)
+ (ledClass :initarg :ledClass :type xcb:CARD16)
+ (ledID :initarg :ledID :type xcb:CARD16)
+ (ledsDefined :initarg :ledsDefined :type xcb:CARD32)
+ (ledState :initarg :ledState :type xcb:CARD32)
+ (firstButton :initarg :firstButton :type xcb:CARD8)
+ (nButtons :initarg :nButtons :type xcb:CARD8)
+ (supported :initarg :supported :type xcb:CARD16)
+ (unsupported :initarg :unsupported :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)))
+
+(defconst xcb:xkb:error-number-class-alist
+ '((0 . xcb:xkb:Keyboard))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:xkb:event-number-class-alist
+ '((0 . xcb:xkb:NewKeyboardNotify)
+ (1 . xcb:xkb:MapNotify)
+ (2 . xcb:xkb:StateNotify)
+ (3 . xcb:xkb:ControlsNotify)
+ (4 . xcb:xkb:IndicatorStateNotify)
+ (5 . xcb:xkb:IndicatorMapNotify)
+ (6 . xcb:xkb:NamesNotify)
+ (7 . xcb:xkb:CompatMapNotify)
+ (8 . xcb:xkb:BellNotify)
+ (9 . xcb:xkb:ActionMessage)
+ (10 . xcb:xkb:AccessXNotify)
+ (11 . xcb:xkb:ExtensionDeviceNotify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-xkb)
+
+;;; xcb-xkb.el ends here
diff --git a/elpa/xelb-0.20/xcb-xkb.elc b/elpa/xelb-0.20/xcb-xkb.elc
new file mode 100644
index 0000000..83a97c2
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xkb.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xlib.el b/elpa/xelb-0.20/xcb-xlib.el
new file mode 100644
index 0000000..0f4f5ea
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xlib.el
@@ -0,0 +1,112 @@
+;;; xcb-xlib.el --- Port of Xlib -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 file currently only contains constants from 'Xlib.h'
+
+;;; Code:
+
+(defconst xlib:XNRequiredCharSet "requiredCharSet")
+(defconst xlib:XNQueryOrientation "queryOrientation")
+(defconst xlib:XNBaseFontName "baseFontName")
+(defconst xlib:XNOMAutomatic "omAutomatic")
+(defconst xlib:XNMissingCharSet "missingCharSet")
+(defconst xlib:XNDefaultString "defaultString")
+(defconst xlib:XNOrientation "orientation")
+(defconst xlib:XNDirectionalDependentDrawing "directionalDependentDrawing")
+(defconst xlib:XNContextualDrawing "contextualDrawing")
+(defconst xlib:XNFontInfo "fontInfo")
+
+(defconst xlib:XNVaNestedList "XNVaNestedList")
+(defconst xlib:XNQueryInputStyle "queryInputStyle")
+(defconst xlib:XNClientWindow "clientWindow")
+(defconst xlib:XNInputStyle "inputStyle")
+(defconst xlib:XNFocusWindow "focusWindow")
+(defconst xlib:XNResourceName "resourceName")
+(defconst xlib:XNResourceClass "resourceClass")
+(defconst xlib:XNGeometryCallback "geometryCallback")
+(defconst xlib:XNDestroyCallback "destroyCallback")
+(defconst xlib:XNFilterEvents "filterEvents")
+(defconst xlib:XNPreeditStartCallback "preeditStartCallback")
+(defconst xlib:XNPreeditDoneCallback "preeditDoneCallback")
+(defconst xlib:XNPreeditDrawCallback "preeditDrawCallback")
+(defconst xlib:XNPreeditCaretCallback "preeditCaretCallback")
+(defconst xlib:XNPreeditStateNotifyCallback "preeditStateNotifyCallback")
+(defconst xlib:XNPreeditAttributes "preeditAttributes")
+(defconst xlib:XNStatusStartCallback "statusStartCallback")
+(defconst xlib:XNStatusDoneCallback "statusDoneCallback")
+(defconst xlib:XNStatusDrawCallback "statusDrawCallback")
+(defconst xlib:XNStatusAttributes "statusAttributes")
+(defconst xlib:XNArea "area")
+(defconst xlib:XNAreaNeeded "areaNeeded")
+(defconst xlib:XNSpotLocation "spotLocation")
+(defconst xlib:XNColormap "colorMap")
+(defconst xlib:XNStdColormap "stdColorMap")
+(defconst xlib:XNForeground "foreground")
+(defconst xlib:XNBackground "background")
+(defconst xlib:XNBackgroundPixmap "backgroundPixmap")
+(defconst xlib:XNFontSet "fontSet")
+(defconst xlib:XNLineSpace "lineSpace")
+(defconst xlib:XNCursor "cursor")
+(defconst xlib:XNQueryIMValuesList "queryIMValuesList")
+(defconst xlib:XNQueryICValuesList "queryICValuesList")
+(defconst xlib:XNVisiblePosition "visiblePosition")
+(defconst xlib:XNR6PreeditCallback "r6PreeditCallback")
+(defconst xlib:XNStringConversionCallback "stringConversionCallback")
+(defconst xlib:XNStringConversion "stringConversion")
+(defconst xlib:XNResetState "resetState")
+(defconst xlib:XNHotKey "hotKey")
+(defconst xlib:XNHotKeyState "hotKeyState")
+(defconst xlib:XNPreeditState "preeditState")
+(defconst xlib:XNSeparatorofNestedList "separatorofNestedList")
+
+(defconst xlib:XIMPreeditArea #x0001)
+(defconst xlib:XIMPreeditCallbacks #x0002)
+(defconst xlib:XIMPreeditPosition #x0004)
+(defconst xlib:XIMPreeditNothing #x0008)
+(defconst xlib:XIMPreeditNone #x0010)
+(defconst xlib:XIMStatusArea #x0100)
+(defconst xlib:XIMStatusCallbacks #x0200)
+(defconst xlib:XIMStatusNothing #x0400)
+(defconst xlib:XIMStatusNone #x0800)
+
+(defconst xlib:XIMReverse #x001)
+(defconst xlib:XIMUnderline #x002)
+(defconst xlib:XIMHighlight #x004)
+(defconst xlib:XIMPrimary #x010)
+(defconst xlib:XIMSecondary #x020)
+(defconst xlib:XIMTertiary #x040)
+(defconst xlib:XIMVisibleToForward #x080)
+(defconst xlib:XIMVisibleToBackword #x100)
+(defconst xlib:XIMVisibleToCenter #x200)
+
+(defconst xlib:XBufferOverflow -1)
+(defconst xlib:XLookupNone 1)
+(defconst xlib:XLookupChars 2)
+(defconst xlib:XLookupKeySym 3)
+(defconst xlib:XLookupBoth 4)
+
+
+
+(provide 'xcb-xlib)
+
+;;; xcb-xlib.el ends here
diff --git a/elpa/xelb-0.20/xcb-xlib.elc b/elpa/xelb-0.20/xcb-xlib.elc
new file mode 100644
index 0000000..24a3430
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xlib.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xprint.el b/elpa/xelb-0.20/xcb-xprint.el
new file mode 100644
index 0000000..36abd27
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xprint.el
@@ -0,0 +1,414 @@
+;;; xcb-xprint.el --- X11 XPrint extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xprint.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xprint:-extension-xname "XpExtension")
+(defconst xcb:xprint:-extension-name "XPrint")
+(defconst xcb:xprint:-major-version 1)
+(defconst xcb:xprint:-minor-version 0)
+
+(require 'xcb-xproto)
+
+(xcb:deftypealias 'xcb:xprint:STRING8 'xcb:char)
+
+(defclass xcb:xprint:PRINTER
+ (xcb:-struct)
+ ((nameLen :initarg :nameLen :type xcb:CARD32)
+ (name~ :initform
+ '(name name type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'nameLen))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (descLen :initarg :descLen :type xcb:CARD32)
+ (description~ :initform
+ '(name description type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'descLen))
+ :type xcb:-list)
+ (description :initarg :description :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)))
+
+(xcb:deftypealias 'xcb:xprint:PCONTEXT 'xcb:-u4)
+
+(defconst xcb:xprint:GetDoc:Finished 0)
+(defconst xcb:xprint:GetDoc:SecondConsumer 1)
+
+(defconst xcb:xprint:EvMask:NoEventMask 0)
+(defconst xcb:xprint:EvMask:PrintMask 1)
+(defconst xcb:xprint:EvMask:AttributeMask 2)
+
+(defconst xcb:xprint:Detail:StartJobNotify 1)
+(defconst xcb:xprint:Detail:EndJobNotify 2)
+(defconst xcb:xprint:Detail:StartDocNotify 3)
+(defconst xcb:xprint:Detail:EndDocNotify 4)
+(defconst xcb:xprint:Detail:StartPageNotify 5)
+(defconst xcb:xprint:Detail:EndPageNotify 6)
+
+(defconst xcb:xprint:Attr:JobAttr 1)
+(defconst xcb:xprint:Attr:DocAttr 2)
+(defconst xcb:xprint:Attr:PageAttr 3)
+(defconst xcb:xprint:Attr:PrinterAttr 4)
+(defconst xcb:xprint:Attr:ServerAttr 5)
+(defconst xcb:xprint:Attr:MediumAttr 6)
+(defconst xcb:xprint:Attr:SpoolerAttr 7)
+
+(defclass xcb:xprint:PrintQueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)))
+(defclass xcb:xprint:PrintQueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major-version :initarg :major-version :type xcb:CARD16)
+ (minor-version :initarg :minor-version :type xcb:CARD16)))
+
+(defclass xcb:xprint:PrintGetPrinterList
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (printerNameLen :initarg :printerNameLen :type xcb:CARD32)
+ (localeLen :initarg :localeLen :type xcb:CARD32)
+ (printer-name~ :initform
+ '(name printer-name type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'printerNameLen))
+ :type xcb:-list)
+ (printer-name :initarg :printer-name :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (locale~ :initform
+ '(name locale type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'localeLen))
+ :type xcb:-list)
+ (locale :initarg :locale :type xcb:-ignore)))
+(defclass xcb:xprint:PrintGetPrinterList~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (listCount :initarg :listCount :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (printers~ :initform
+ '(name printers type xcb:xprint:PRINTER size
+ (xcb:-fieldref 'listCount))
+ :type xcb:-list)
+ (printers :initarg :printers :type xcb:-ignore)))
+
+(defclass xcb:xprint:PrintRehashPrinterList
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)))
+
+(defclass xcb:xprint:CreateContext
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (context-id :initarg :context-id :type xcb:CARD32)
+ (printerNameLen :initarg :printerNameLen :type xcb:CARD32)
+ (localeLen :initarg :localeLen :type xcb:CARD32)
+ (printerName~ :initform
+ '(name printerName type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'printerNameLen))
+ :type xcb:-list)
+ (printerName :initarg :printerName :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (locale~ :initform
+ '(name locale type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'localeLen))
+ :type xcb:-list)
+ (locale :initarg :locale :type xcb:-ignore)))
+
+(defclass xcb:xprint:PrintSetContext
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (context :initarg :context :type xcb:CARD32)))
+
+(defclass xcb:xprint:PrintGetContext
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)))
+(defclass xcb:xprint:PrintGetContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context :initarg :context :type xcb:CARD32)))
+
+(defclass xcb:xprint:PrintDestroyContext
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (context :initarg :context :type xcb:CARD32)))
+
+(defclass xcb:xprint:PrintGetScreenOfContext
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)))
+(defclass xcb:xprint:PrintGetScreenOfContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)))
+
+(defclass xcb:xprint:PrintStartJob
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (output-mode :initarg :output-mode :type xcb:CARD8)))
+
+(defclass xcb:xprint:PrintEndJob
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (cancel :initarg :cancel :type xcb:BOOL)))
+
+(defclass xcb:xprint:PrintStartDoc
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (driver-mode :initarg :driver-mode :type xcb:CARD8)))
+
+(defclass xcb:xprint:PrintEndDoc
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (cancel :initarg :cancel :type xcb:BOOL)))
+
+(defclass xcb:xprint:PrintPutDocumentData
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (len-data :initarg :len-data :type xcb:CARD32)
+ (len-fmt :initarg :len-fmt :type xcb:CARD16)
+ (len-options :initarg :len-options :type xcb:CARD16)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (xcb:-fieldref 'len-data))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (doc-format~ :initform
+ '(name doc-format type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'len-fmt))
+ :type xcb:-list)
+ (doc-format :initarg :doc-format :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (options~ :initform
+ '(name options type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'len-options))
+ :type xcb:-list)
+ (options :initarg :options :type xcb:-ignore)))
+
+(defclass xcb:xprint:PrintGetDocumentData
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)
+ (max-bytes :initarg :max-bytes :type xcb:CARD32)))
+(defclass xcb:xprint:PrintGetDocumentData~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (status-code :initarg :status-code :type xcb:CARD32)
+ (finished-flag :initarg :finished-flag :type xcb:CARD32)
+ (dataLen :initarg :dataLen :type xcb:CARD32)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (xcb:-fieldref 'dataLen))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:xprint:PrintStartPage
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:xprint:PrintEndPage
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (cancel :initarg :cancel :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xprint:PrintSelectInput
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)
+ (event-mask :initarg :event-mask :type xcb:CARD32)))
+
+(defclass xcb:xprint:PrintInputSelected
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)))
+(defclass xcb:xprint:PrintInputSelected~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (event-mask :initarg :event-mask :type xcb:CARD32)
+ (all-events-mask :initarg :all-events-mask :type xcb:CARD32)))
+
+(defclass xcb:xprint:PrintGetAttributes
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)
+ (pool :initarg :pool :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xprint:PrintGetAttributes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (stringLen :initarg :stringLen :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (attributes~ :initform
+ '(name attributes type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'stringLen))
+ :type xcb:-list)
+ (attributes :initarg :attributes :type xcb:-ignore)))
+
+(defclass xcb:xprint:PrintGetOneAttributes
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)
+ (nameLen :initarg :nameLen :type xcb:CARD32)
+ (pool :initarg :pool :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'nameLen))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+(defclass xcb:xprint:PrintGetOneAttributes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (valueLen :initarg :valueLen :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (value~ :initform
+ '(name value type xcb:xprint:STRING8 size
+ (xcb:-fieldref 'valueLen))
+ :type xcb:-list)
+ (value :initarg :value :type xcb:-ignore)))
+
+(defclass xcb:xprint:PrintSetAttributes
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)
+ (stringLen :initarg :stringLen :type xcb:CARD32)
+ (pool :initarg :pool :type xcb:CARD8)
+ (rule :initarg :rule :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (attributes~ :initform
+ '(name attributes type xcb:xprint:STRING8 size nil)
+ :type xcb:-list)
+ (attributes :initarg :attributes :type xcb:-ignore)))
+
+(defclass xcb:xprint:PrintGetPageDimensions
+ (xcb:-request)
+ ((~opcode :initform 21 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)))
+(defclass xcb:xprint:PrintGetPageDimensions~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (offset-x :initarg :offset-x :type xcb:CARD16)
+ (offset-y :initarg :offset-y :type xcb:CARD16)
+ (reproducible-width :initarg :reproducible-width :type xcb:CARD16)
+ (reproducible-height :initarg :reproducible-height :type xcb:CARD16)))
+
+(defclass xcb:xprint:PrintQueryScreens
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)))
+(defclass xcb:xprint:PrintQueryScreens~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (listCount :initarg :listCount :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (roots~ :initform
+ '(name roots type xcb:WINDOW size
+ (xcb:-fieldref 'listCount))
+ :type xcb:-list)
+ (roots :initarg :roots :type xcb:-ignore)))
+
+(defclass xcb:xprint:PrintSetImageResolution
+ (xcb:-request)
+ ((~opcode :initform 23 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)
+ (image-resolution :initarg :image-resolution :type xcb:CARD16)))
+(defclass xcb:xprint:PrintSetImageResolution~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (previous-resolutions :initarg :previous-resolutions :type xcb:CARD16)))
+
+(defclass xcb:xprint:PrintGetImageResolution
+ (xcb:-request)
+ ((~opcode :initform 24 :type xcb:-u1)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)))
+(defclass xcb:xprint:PrintGetImageResolution~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (image-resolution :initarg :image-resolution :type xcb:CARD16)))
+
+(defclass xcb:xprint:Notify
+ (xcb:-event)
+ ((~code :initform 0)
+ (detail :initarg :detail :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)
+ (cancel :initarg :cancel :type xcb:BOOL)))
+
+(defclass xcb:xprint:AttributNotify
+ (xcb:-event)
+ ((~code :initform 1)
+ (detail :initarg :detail :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (context :initarg :context :type xcb:xprint:PCONTEXT)))
+
+(defclass xcb:xprint:BadContext
+ (xcb:-error)
+ ((~code :initform 0)))
+
+(defclass xcb:xprint:BadSequence
+ (xcb:-error)
+ ((~code :initform 1)))
+
+(defconst xcb:xprint:error-number-class-alist
+ '((0 . xcb:xprint:BadContext)
+ (1 . xcb:xprint:BadSequence))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:xprint:event-number-class-alist
+ '((0 . xcb:xprint:Notify)
+ (1 . xcb:xprint:AttributNotify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-xprint)
+
+;;; xcb-xprint.el ends here
diff --git a/elpa/xelb-0.20/xcb-xprint.elc b/elpa/xelb-0.20/xcb-xprint.elc
new file mode 100644
index 0000000..c4d7731
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xprint.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xproto.el b/elpa/xelb-0.20/xcb-xproto.el
new file mode 100644
index 0000000..19b1f09
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xproto.el
@@ -0,0 +1,3012 @@
+;;; xcb-xproto.el --- X11 core protocol -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xproto.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defclass xcb:CHAR2B
+ (xcb:-struct)
+ ((byte1 :initarg :byte1 :type xcb:CARD8)
+ (byte2 :initarg :byte2 :type xcb:CARD8)))
+
+(xcb:deftypealias 'xcb:WINDOW 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:PIXMAP 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:CURSOR 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:FONT 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:GCONTEXT 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:COLORMAP 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:ATOM 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:DRAWABLE 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:FONTABLE 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:BOOL32 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:VISUALID 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:TIMESTAMP 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:KEYSYM 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:KEYCODE 'xcb:CARD8)
+
+(xcb:deftypealias 'xcb:KEYCODE32 'xcb:CARD32)
+
+(xcb:deftypealias 'xcb:BUTTON 'xcb:CARD8)
+
+(defclass xcb:POINT
+ (xcb:-struct)
+ ((x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)))
+
+(defclass xcb:RECTANGLE
+ (xcb:-struct)
+ ((x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defclass xcb:ARC
+ (xcb:-struct)
+ ((x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (angle1 :initarg :angle1 :type xcb:INT16)
+ (angle2 :initarg :angle2 :type xcb:INT16)))
+
+(defclass xcb:FORMAT
+ (xcb:-struct)
+ ((depth :initarg :depth :type xcb:CARD8)
+ (bits-per-pixel :initarg :bits-per-pixel :type xcb:CARD8)
+ (scanline-pad :initarg :scanline-pad :type xcb:CARD8)
+ (pad~0 :initform 5 :type xcb:-pad)))
+
+(defconst xcb:VisualClass:StaticGray 0)
+(defconst xcb:VisualClass:GrayScale 1)
+(defconst xcb:VisualClass:StaticColor 2)
+(defconst xcb:VisualClass:PseudoColor 3)
+(defconst xcb:VisualClass:TrueColor 4)
+(defconst xcb:VisualClass:DirectColor 5)
+
+(defclass xcb:VISUALTYPE
+ (xcb:-struct)
+ ((visual-id :initarg :visual-id :type xcb:VISUALID)
+ (class :initarg :class :type xcb:CARD8)
+ (bits-per-rgb-value :initarg :bits-per-rgb-value :type xcb:CARD8)
+ (colormap-entries :initarg :colormap-entries :type xcb:CARD16)
+ (red-mask :initarg :red-mask :type xcb:CARD32)
+ (green-mask :initarg :green-mask :type xcb:CARD32)
+ (blue-mask :initarg :blue-mask :type xcb:CARD32)
+ (pad~0 :initform 4 :type xcb:-pad)))
+
+(defclass xcb:DEPTH
+ (xcb:-struct)
+ ((depth :initarg :depth :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (visuals-len :initarg :visuals-len :type xcb:CARD16)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (visuals~ :initform
+ '(name visuals type xcb:VISUALTYPE size
+ (xcb:-fieldref 'visuals-len))
+ :type xcb:-list)
+ (visuals :initarg :visuals :type xcb:-ignore)))
+
+(defconst xcb:EventMask:NoEvent 0)
+(defconst xcb:EventMask:KeyPress 1)
+(defconst xcb:EventMask:KeyRelease 2)
+(defconst xcb:EventMask:ButtonPress 4)
+(defconst xcb:EventMask:ButtonRelease 8)
+(defconst xcb:EventMask:EnterWindow 16)
+(defconst xcb:EventMask:LeaveWindow 32)
+(defconst xcb:EventMask:PointerMotion 64)
+(defconst xcb:EventMask:PointerMotionHint 128)
+(defconst xcb:EventMask:Button1Motion 256)
+(defconst xcb:EventMask:Button2Motion 512)
+(defconst xcb:EventMask:Button3Motion 1024)
+(defconst xcb:EventMask:Button4Motion 2048)
+(defconst xcb:EventMask:Button5Motion 4096)
+(defconst xcb:EventMask:ButtonMotion 8192)
+(defconst xcb:EventMask:KeymapState 16384)
+(defconst xcb:EventMask:Exposure 32768)
+(defconst xcb:EventMask:VisibilityChange 65536)
+(defconst xcb:EventMask:StructureNotify 131072)
+(defconst xcb:EventMask:ResizeRedirect 262144)
+(defconst xcb:EventMask:SubstructureNotify 524288)
+(defconst xcb:EventMask:SubstructureRedirect 1048576)
+(defconst xcb:EventMask:FocusChange 2097152)
+(defconst xcb:EventMask:PropertyChange 4194304)
+(defconst xcb:EventMask:ColorMapChange 8388608)
+(defconst xcb:EventMask:OwnerGrabButton 16777216)
+
+(defconst xcb:BackingStore:NotUseful 0)
+(defconst xcb:BackingStore:WhenMapped 1)
+(defconst xcb:BackingStore:Always 2)
+
+(defclass xcb:SCREEN
+ (xcb:-struct)
+ ((root :initarg :root :type xcb:WINDOW)
+ (default-colormap :initarg :default-colormap :type xcb:COLORMAP)
+ (white-pixel :initarg :white-pixel :type xcb:CARD32)
+ (black-pixel :initarg :black-pixel :type xcb:CARD32)
+ (current-input-masks :initarg :current-input-masks :type xcb:CARD32)
+ (width-in-pixels :initarg :width-in-pixels :type xcb:CARD16)
+ (height-in-pixels :initarg :height-in-pixels :type xcb:CARD16)
+ (width-in-millimeters :initarg :width-in-millimeters :type xcb:CARD16)
+ (height-in-millimeters :initarg :height-in-millimeters :type xcb:CARD16)
+ (min-installed-maps :initarg :min-installed-maps :type xcb:CARD16)
+ (max-installed-maps :initarg :max-installed-maps :type xcb:CARD16)
+ (root-visual :initarg :root-visual :type xcb:VISUALID)
+ (backing-stores :initarg :backing-stores :type xcb:BYTE)
+ (save-unders :initarg :save-unders :type xcb:BOOL)
+ (root-depth :initarg :root-depth :type xcb:CARD8)
+ (allowed-depths-len :initarg :allowed-depths-len :type xcb:CARD8)
+ (allowed-depths~ :initform
+ '(name allowed-depths type xcb:DEPTH size
+ (xcb:-fieldref 'allowed-depths-len))
+ :type xcb:-list)
+ (allowed-depths :initarg :allowed-depths :type xcb:-ignore)))
+
+(defclass xcb:SetupRequest
+ (xcb:-struct)
+ ((byte-order :initarg :byte-order :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (protocol-major-version :initarg :protocol-major-version :type xcb:CARD16)
+ (protocol-minor-version :initarg :protocol-minor-version :type xcb:CARD16)
+ (authorization-protocol-name-len :initarg :authorization-protocol-name-len :type xcb:CARD16)
+ (authorization-protocol-data-len :initarg :authorization-protocol-data-len :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (authorization-protocol-name~ :initform
+ '(name authorization-protocol-name type xcb:char size
+ (xcb:-fieldref 'authorization-protocol-name-len))
+ :type xcb:-list)
+ (authorization-protocol-name :initarg :authorization-protocol-name :type xcb:-ignore)
+ (pad~2 :initform 4 :type xcb:-pad-align)
+ (authorization-protocol-data~ :initform
+ '(name authorization-protocol-data type xcb:char size
+ (xcb:-fieldref 'authorization-protocol-data-len))
+ :type xcb:-list)
+ (authorization-protocol-data :initarg :authorization-protocol-data :type xcb:-ignore)
+ (pad~3 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:SetupFailed
+ (xcb:-struct)
+ ((status :initarg :status :type xcb:CARD8)
+ (reason-len :initarg :reason-len :type xcb:CARD8)
+ (protocol-major-version :initarg :protocol-major-version :type xcb:CARD16)
+ (protocol-minor-version :initarg :protocol-minor-version :type xcb:CARD16)
+ (length :initarg :length :type xcb:CARD16)
+ (reason~ :initform
+ '(name reason type xcb:char size
+ (xcb:-fieldref 'reason-len))
+ :type xcb:-list)
+ (reason :initarg :reason :type xcb:-ignore)))
+
+(defclass xcb:SetupAuthenticate
+ (xcb:-struct)
+ ((status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 5 :type xcb:-pad)
+ (length :initarg :length :type xcb:CARD16)
+ (reason~ :initform
+ '(name reason type xcb:char size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (reason :initarg :reason :type xcb:-ignore)))
+
+(defconst xcb:ImageOrder:LSBFirst 0)
+(defconst xcb:ImageOrder:MSBFirst 1)
+
+(defclass xcb:Setup
+ (xcb:-struct)
+ ((status :initarg :status :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (protocol-major-version :initarg :protocol-major-version :type xcb:CARD16)
+ (protocol-minor-version :initarg :protocol-minor-version :type xcb:CARD16)
+ (length :initarg :length :type xcb:CARD16)
+ (release-number :initarg :release-number :type xcb:CARD32)
+ (resource-id-base :initarg :resource-id-base :type xcb:CARD32)
+ (resource-id-mask :initarg :resource-id-mask :type xcb:CARD32)
+ (motion-buffer-size :initarg :motion-buffer-size :type xcb:CARD32)
+ (vendor-len :initarg :vendor-len :type xcb:CARD16)
+ (maximum-request-length :initarg :maximum-request-length :type xcb:CARD16)
+ (roots-len :initarg :roots-len :type xcb:CARD8)
+ (pixmap-formats-len :initarg :pixmap-formats-len :type xcb:CARD8)
+ (image-byte-order :initarg :image-byte-order :type xcb:CARD8)
+ (bitmap-format-bit-order :initarg :bitmap-format-bit-order :type xcb:CARD8)
+ (bitmap-format-scanline-unit :initarg :bitmap-format-scanline-unit :type xcb:CARD8)
+ (bitmap-format-scanline-pad :initarg :bitmap-format-scanline-pad :type xcb:CARD8)
+ (min-keycode :initarg :min-keycode :type xcb:KEYCODE)
+ (max-keycode :initarg :max-keycode :type xcb:KEYCODE)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (vendor~ :initform
+ '(name vendor type xcb:char size
+ (xcb:-fieldref 'vendor-len))
+ :type xcb:-list)
+ (vendor :initarg :vendor :type xcb:-ignore)
+ (pad~2 :initform 4 :type xcb:-pad-align)
+ (pixmap-formats~ :initform
+ '(name pixmap-formats type xcb:FORMAT size
+ (xcb:-fieldref 'pixmap-formats-len))
+ :type xcb:-list)
+ (pixmap-formats :initarg :pixmap-formats :type xcb:-ignore)
+ (roots~ :initform
+ '(name roots type xcb:SCREEN size
+ (xcb:-fieldref 'roots-len))
+ :type xcb:-list)
+ (roots :initarg :roots :type xcb:-ignore)))
+
+(defconst xcb:ModMask:Shift 1)
+(defconst xcb:ModMask:Lock 2)
+(defconst xcb:ModMask:Control 4)
+(defconst xcb:ModMask:1 8)
+(defconst xcb:ModMask:2 16)
+(defconst xcb:ModMask:3 32)
+(defconst xcb:ModMask:4 64)
+(defconst xcb:ModMask:5 128)
+(defconst xcb:ModMask:Any 32768)
+
+(defconst xcb:KeyButMask:Shift 1)
+(defconst xcb:KeyButMask:Lock 2)
+(defconst xcb:KeyButMask:Control 4)
+(defconst xcb:KeyButMask:Mod1 8)
+(defconst xcb:KeyButMask:Mod2 16)
+(defconst xcb:KeyButMask:Mod3 32)
+(defconst xcb:KeyButMask:Mod4 64)
+(defconst xcb:KeyButMask:Mod5 128)
+(defconst xcb:KeyButMask:Button1 256)
+(defconst xcb:KeyButMask:Button2 512)
+(defconst xcb:KeyButMask:Button3 1024)
+(defconst xcb:KeyButMask:Button4 2048)
+(defconst xcb:KeyButMask:Button5 4096)
+
+(defconst xcb:Window:None 0)
+
+(defclass xcb:KeyPress
+ (xcb:-event)
+ ((~code :initform 2)
+ (detail :initarg :detail :type xcb:KEYCODE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:INT16)
+ (root-y :initarg :root-y :type xcb:INT16)
+ (event-x :initarg :event-x :type xcb:INT16)
+ (event-y :initarg :event-y :type xcb:INT16)
+ (state :initarg :state :type xcb:CARD16)
+ (same-screen :initarg :same-screen :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:KeyRelease
+ (xcb:KeyPress)
+ ((~code :initform 3)))
+
+(defconst xcb:ButtonMask:1 256)
+(defconst xcb:ButtonMask:2 512)
+(defconst xcb:ButtonMask:3 1024)
+(defconst xcb:ButtonMask:4 2048)
+(defconst xcb:ButtonMask:5 4096)
+(defconst xcb:ButtonMask:Any 32768)
+
+(defclass xcb:ButtonPress
+ (xcb:-event)
+ ((~code :initform 4)
+ (detail :initarg :detail :type xcb:BUTTON)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:INT16)
+ (root-y :initarg :root-y :type xcb:INT16)
+ (event-x :initarg :event-x :type xcb:INT16)
+ (event-y :initarg :event-y :type xcb:INT16)
+ (state :initarg :state :type xcb:CARD16)
+ (same-screen :initarg :same-screen :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:ButtonRelease
+ (xcb:ButtonPress)
+ ((~code :initform 5)))
+
+(defconst xcb:Motion:Normal 0)
+(defconst xcb:Motion:Hint 1)
+
+(defclass xcb:MotionNotify
+ (xcb:-event)
+ ((~code :initform 6)
+ (detail :initarg :detail :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:INT16)
+ (root-y :initarg :root-y :type xcb:INT16)
+ (event-x :initarg :event-x :type xcb:INT16)
+ (event-y :initarg :event-y :type xcb:INT16)
+ (state :initarg :state :type xcb:CARD16)
+ (same-screen :initarg :same-screen :type xcb:BOOL)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defconst xcb:NotifyDetail:Ancestor 0)
+(defconst xcb:NotifyDetail:Virtual 1)
+(defconst xcb:NotifyDetail:Inferior 2)
+(defconst xcb:NotifyDetail:Nonlinear 3)
+(defconst xcb:NotifyDetail:NonlinearVirtual 4)
+(defconst xcb:NotifyDetail:Pointer 5)
+(defconst xcb:NotifyDetail:PointerRoot 6)
+(defconst xcb:NotifyDetail:None 7)
+
+(defconst xcb:NotifyMode:Normal 0)
+(defconst xcb:NotifyMode:Grab 1)
+(defconst xcb:NotifyMode:Ungrab 2)
+(defconst xcb:NotifyMode:WhileGrabbed 3)
+
+(defclass xcb:EnterNotify
+ (xcb:-event)
+ ((~code :initform 7)
+ (detail :initarg :detail :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (root :initarg :root :type xcb:WINDOW)
+ (event :initarg :event :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:INT16)
+ (root-y :initarg :root-y :type xcb:INT16)
+ (event-x :initarg :event-x :type xcb:INT16)
+ (event-y :initarg :event-y :type xcb:INT16)
+ (state :initarg :state :type xcb:CARD16)
+ (mode :initarg :mode :type xcb:BYTE)
+ (same-screen-focus :initarg :same-screen-focus :type xcb:BYTE)))
+
+(defclass xcb:LeaveNotify
+ (xcb:EnterNotify)
+ ((~code :initform 8)))
+
+(defclass xcb:FocusIn
+ (xcb:-event)
+ ((~code :initform 9)
+ (detail :initarg :detail :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (event :initarg :event :type xcb:WINDOW)
+ (mode :initarg :mode :type xcb:BYTE)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:FocusOut
+ (xcb:FocusIn)
+ ((~code :initform 10)))
+
+(defclass xcb:KeymapNotify
+ (xcb:-event)
+ ((~code :initform 11)
+ (keys~ :initform
+ '(name keys type xcb:CARD8 size 31)
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)))
+
+(defclass xcb:Expose
+ (xcb:-event)
+ ((~code :initform 12)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (window :initarg :window :type xcb:WINDOW)
+ (x :initarg :x :type xcb:CARD16)
+ (y :initarg :y :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (count :initarg :count :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:GraphicsExposure
+ (xcb:-event)
+ ((~code :initform 13)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (x :initarg :x :type xcb:CARD16)
+ (y :initarg :y :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD16)
+ (count :initarg :count :type xcb:CARD16)
+ (major-opcode :initarg :major-opcode :type xcb:CARD8)
+ (pad~1 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:NoExposure
+ (xcb:-event)
+ ((~code :initform 14)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD16)
+ (major-opcode :initarg :major-opcode :type xcb:CARD8)
+ (pad~1 :initform 1 :type xcb:-pad)))
+
+(defconst xcb:Visibility:Unobscured 0)
+(defconst xcb:Visibility:PartiallyObscured 1)
+(defconst xcb:Visibility:FullyObscured 2)
+
+(defclass xcb:VisibilityNotify
+ (xcb:-event)
+ ((~code :initform 15)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (window :initarg :window :type xcb:WINDOW)
+ (state :initarg :state :type xcb:BYTE)
+ (pad~1 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:CreateNotify
+ (xcb:-event)
+ ((~code :initform 16)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (parent :initarg :parent :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (border-width :initarg :border-width :type xcb:CARD16)
+ (override-redirect :initarg :override-redirect :type xcb:BOOL)
+ (pad~1 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:DestroyNotify
+ (xcb:-event)
+ ((~code :initform 17)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event :initarg :event :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:UnmapNotify
+ (xcb:-event)
+ ((~code :initform 18)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event :initarg :event :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (from-configure :initarg :from-configure :type xcb:BOOL)
+ (pad~1 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:MapNotify
+ (xcb:-event)
+ ((~code :initform 19)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event :initarg :event :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (override-redirect :initarg :override-redirect :type xcb:BOOL)
+ (pad~1 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:MapRequest
+ (xcb:-event)
+ ((~code :initform 20)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (parent :initarg :parent :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:ReparentNotify
+ (xcb:-event)
+ ((~code :initform 21)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event :initarg :event :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (parent :initarg :parent :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (override-redirect :initarg :override-redirect :type xcb:BOOL)
+ (pad~1 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:ConfigureNotify
+ (xcb:-event)
+ ((~code :initform 22)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event :initarg :event :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (above-sibling :initarg :above-sibling :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (border-width :initarg :border-width :type xcb:CARD16)
+ (override-redirect :initarg :override-redirect :type xcb:BOOL)
+ (pad~1 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:ConfigureRequest
+ (xcb:-event)
+ ((~code :initform 23)
+ (stack-mode :initarg :stack-mode :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (parent :initarg :parent :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (sibling :initarg :sibling :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (border-width :initarg :border-width :type xcb:CARD16)
+ (value-mask :initarg :value-mask :type xcb:CARD16)))
+
+(defclass xcb:GravityNotify
+ (xcb:-event)
+ ((~code :initform 24)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event :initarg :event :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)))
+
+(defclass xcb:ResizeRequest
+ (xcb:-event)
+ ((~code :initform 25)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (window :initarg :window :type xcb:WINDOW)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defconst xcb:Place:OnTop 0)
+(defconst xcb:Place:OnBottom 1)
+
+(defclass xcb:CirculateNotify
+ (xcb:-event)
+ ((~code :initform 26)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (event :initarg :event :type xcb:WINDOW)
+ (window :initarg :window :type xcb:WINDOW)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (place :initarg :place :type xcb:BYTE)
+ (pad~2 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:CirculateRequest
+ (xcb:CirculateNotify)
+ ((~code :initform 27)))
+
+(defconst xcb:Property:NewValue 0)
+(defconst xcb:Property:Delete 1)
+
+(defclass xcb:PropertyNotify
+ (xcb:-event)
+ ((~code :initform 28)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (window :initarg :window :type xcb:WINDOW)
+ (atom :initarg :atom :type xcb:ATOM)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (state :initarg :state :type xcb:BYTE)
+ (pad~1 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:SelectionClear
+ (xcb:-event)
+ ((~code :initform 29)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (owner :initarg :owner :type xcb:WINDOW)
+ (selection :initarg :selection :type xcb:ATOM)))
+
+(defconst xcb:Time:CurrentTime 0)
+
+(defconst xcb:Atom:None 0)
+(defconst xcb:Atom:Any 0)
+(defconst xcb:Atom:PRIMARY 1)
+(defconst xcb:Atom:SECONDARY 2)
+(defconst xcb:Atom:ARC 3)
+(defconst xcb:Atom:ATOM 4)
+(defconst xcb:Atom:BITMAP 5)
+(defconst xcb:Atom:CARDINAL 6)
+(defconst xcb:Atom:COLORMAP 7)
+(defconst xcb:Atom:CURSOR 8)
+(defconst xcb:Atom:CUT_BUFFER0 9)
+(defconst xcb:Atom:CUT_BUFFER1 10)
+(defconst xcb:Atom:CUT_BUFFER2 11)
+(defconst xcb:Atom:CUT_BUFFER3 12)
+(defconst xcb:Atom:CUT_BUFFER4 13)
+(defconst xcb:Atom:CUT_BUFFER5 14)
+(defconst xcb:Atom:CUT_BUFFER6 15)
+(defconst xcb:Atom:CUT_BUFFER7 16)
+(defconst xcb:Atom:DRAWABLE 17)
+(defconst xcb:Atom:FONT 18)
+(defconst xcb:Atom:INTEGER 19)
+(defconst xcb:Atom:PIXMAP 20)
+(defconst xcb:Atom:POINT 21)
+(defconst xcb:Atom:RECTANGLE 22)
+(defconst xcb:Atom:RESOURCE_MANAGER 23)
+(defconst xcb:Atom:RGB_COLOR_MAP 24)
+(defconst xcb:Atom:RGB_BEST_MAP 25)
+(defconst xcb:Atom:RGB_BLUE_MAP 26)
+(defconst xcb:Atom:RGB_DEFAULT_MAP 27)
+(defconst xcb:Atom:RGB_GRAY_MAP 28)
+(defconst xcb:Atom:RGB_GREEN_MAP 29)
+(defconst xcb:Atom:RGB_RED_MAP 30)
+(defconst xcb:Atom:STRING 31)
+(defconst xcb:Atom:VISUALID 32)
+(defconst xcb:Atom:WINDOW 33)
+(defconst xcb:Atom:WM_COMMAND 34)
+(defconst xcb:Atom:WM_HINTS 35)
+(defconst xcb:Atom:WM_CLIENT_MACHINE 36)
+(defconst xcb:Atom:WM_ICON_NAME 37)
+(defconst xcb:Atom:WM_ICON_SIZE 38)
+(defconst xcb:Atom:WM_NAME 39)
+(defconst xcb:Atom:WM_NORMAL_HINTS 40)
+(defconst xcb:Atom:WM_SIZE_HINTS 41)
+(defconst xcb:Atom:WM_ZOOM_HINTS 42)
+(defconst xcb:Atom:MIN_SPACE 43)
+(defconst xcb:Atom:NORM_SPACE 44)
+(defconst xcb:Atom:MAX_SPACE 45)
+(defconst xcb:Atom:END_SPACE 46)
+(defconst xcb:Atom:SUPERSCRIPT_X 47)
+(defconst xcb:Atom:SUPERSCRIPT_Y 48)
+(defconst xcb:Atom:SUBSCRIPT_X 49)
+(defconst xcb:Atom:SUBSCRIPT_Y 50)
+(defconst xcb:Atom:UNDERLINE_POSITION 51)
+(defconst xcb:Atom:UNDERLINE_THICKNESS 52)
+(defconst xcb:Atom:STRIKEOUT_ASCENT 53)
+(defconst xcb:Atom:STRIKEOUT_DESCENT 54)
+(defconst xcb:Atom:ITALIC_ANGLE 55)
+(defconst xcb:Atom:X_HEIGHT 56)
+(defconst xcb:Atom:QUAD_WIDTH 57)
+(defconst xcb:Atom:WEIGHT 58)
+(defconst xcb:Atom:POINT_SIZE 59)
+(defconst xcb:Atom:RESOLUTION 60)
+(defconst xcb:Atom:COPYRIGHT 61)
+(defconst xcb:Atom:NOTICE 62)
+(defconst xcb:Atom:FONT_NAME 63)
+(defconst xcb:Atom:FAMILY_NAME 64)
+(defconst xcb:Atom:FULL_NAME 65)
+(defconst xcb:Atom:CAP_HEIGHT 66)
+(defconst xcb:Atom:WM_CLASS 67)
+(defconst xcb:Atom:WM_TRANSIENT_FOR 68)
+
+(defclass xcb:SelectionRequest
+ (xcb:-event)
+ ((~code :initform 30)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (owner :initarg :owner :type xcb:WINDOW)
+ (requestor :initarg :requestor :type xcb:WINDOW)
+ (selection :initarg :selection :type xcb:ATOM)
+ (target :initarg :target :type xcb:ATOM)
+ (property :initarg :property :type xcb:ATOM)))
+
+(defclass xcb:SelectionNotify
+ (xcb:-event)
+ ((~code :initform 31)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (requestor :initarg :requestor :type xcb:WINDOW)
+ (selection :initarg :selection :type xcb:ATOM)
+ (target :initarg :target :type xcb:ATOM)
+ (property :initarg :property :type xcb:ATOM)))
+
+(defconst xcb:ColormapState:Uninstalled 0)
+(defconst xcb:ColormapState:Installed 1)
+
+(defconst xcb:Colormap:None 0)
+
+(defclass xcb:ColormapNotify
+ (xcb:-event)
+ ((~code :initform 32)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (window :initarg :window :type xcb:WINDOW)
+ (colormap :initarg :colormap :type xcb:COLORMAP)
+ (new :initarg :new :type xcb:BOOL)
+ (state :initarg :state :type xcb:BYTE)
+ (pad~1 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:ClientMessageData
+ (xcb:-union)
+ ((~size :initform 20)
+ (data8~ :initform
+ '(name data8 type xcb:CARD8 size 20)
+ :type xcb:-list)
+ (data8 :initarg :data8 :type xcb:-ignore)
+ (data16~ :initform
+ '(name data16 type xcb:CARD16 size 10)
+ :type xcb:-list)
+ (data16 :initarg :data16 :type xcb:-ignore)
+ (data32~ :initform
+ '(name data32 type xcb:CARD32 size 5)
+ :type xcb:-list)
+ (data32 :initarg :data32 :type xcb:-ignore)))
+
+(defclass xcb:ClientMessage
+ (xcb:-event)
+ ((~code :initform 33)
+ (format :initarg :format :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (window :initarg :window :type xcb:WINDOW)
+ (type :initarg :type :type xcb:ATOM)
+ (data :initarg :data :type xcb:ClientMessageData)))
+
+(defconst xcb:Mapping:Modifier 0)
+(defconst xcb:Mapping:Keyboard 1)
+(defconst xcb:Mapping:Pointer 2)
+
+(defclass xcb:MappingNotify
+ (xcb:-event)
+ ((~code :initform 34)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (request :initarg :request :type xcb:BYTE)
+ (first-keycode :initarg :first-keycode :type xcb:KEYCODE)
+ (count :initarg :count :type xcb:CARD8)
+ (pad~1 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:GeGeneric
+ (xcb:-generic-event)
+ ((pad~0 :initform 22 :type xcb:-pad)))
+
+(defclass xcb:Request
+ (xcb:-error)
+ ((~code :initform 1)
+ (bad-value :initarg :bad-value :type xcb:CARD32)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD16)
+ (major-opcode :initarg :major-opcode :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:Value
+ (xcb:-error)
+ ((~code :initform 2)
+ (bad-value :initarg :bad-value :type xcb:CARD32)
+ (minor-opcode :initarg :minor-opcode :type xcb:CARD16)
+ (major-opcode :initarg :major-opcode :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:Window
+ (xcb:-error xcb:Value)
+ ((~code :initform 3)))
+
+(defclass xcb:Pixmap
+ (xcb:-error xcb:Value)
+ ((~code :initform 4)))
+
+(defclass xcb:Atom
+ (xcb:-error xcb:Value)
+ ((~code :initform 5)))
+
+(defclass xcb:Cursor
+ (xcb:-error xcb:Value)
+ ((~code :initform 6)))
+
+(defclass xcb:Font
+ (xcb:-error xcb:Value)
+ ((~code :initform 7)))
+
+(defclass xcb:Match
+ (xcb:-error xcb:Request)
+ ((~code :initform 8)))
+
+(defclass xcb:Drawable
+ (xcb:-error xcb:Value)
+ ((~code :initform 9)))
+
+(defclass xcb:Access
+ (xcb:-error xcb:Request)
+ ((~code :initform 10)))
+
+(defclass xcb:Alloc
+ (xcb:-error xcb:Request)
+ ((~code :initform 11)))
+
+(defclass xcb:Colormap
+ (xcb:-error xcb:Value)
+ ((~code :initform 12)))
+
+(defclass xcb:GContext
+ (xcb:-error xcb:Value)
+ ((~code :initform 13)))
+
+(defclass xcb:IDChoice
+ (xcb:-error xcb:Value)
+ ((~code :initform 14)))
+
+(defclass xcb:Name
+ (xcb:-error xcb:Request)
+ ((~code :initform 15)))
+
+(defclass xcb:Length
+ (xcb:-error xcb:Request)
+ ((~code :initform 16)))
+
+(defclass xcb:Implementation
+ (xcb:-error xcb:Request)
+ ((~code :initform 17)))
+
+(defconst xcb:WindowClass:CopyFromParent 0)
+(defconst xcb:WindowClass:InputOutput 1)
+(defconst xcb:WindowClass:InputOnly 2)
+
+(defconst xcb:CW:BackPixmap 1)
+(defconst xcb:CW:BackPixel 2)
+(defconst xcb:CW:BorderPixmap 4)
+(defconst xcb:CW:BorderPixel 8)
+(defconst xcb:CW:BitGravity 16)
+(defconst xcb:CW:WinGravity 32)
+(defconst xcb:CW:BackingStore 64)
+(defconst xcb:CW:BackingPlanes 128)
+(defconst xcb:CW:BackingPixel 256)
+(defconst xcb:CW:OverrideRedirect 512)
+(defconst xcb:CW:SaveUnder 1024)
+(defconst xcb:CW:EventMask 2048)
+(defconst xcb:CW:DontPropagate 4096)
+(defconst xcb:CW:Colormap 8192)
+(defconst xcb:CW:Cursor 16384)
+
+(defconst xcb:BackPixmap:None 0)
+(defconst xcb:BackPixmap:ParentRelative 1)
+
+(defconst xcb:Gravity:BitForget 0)
+(defconst xcb:Gravity:WinUnmap 0)
+(defconst xcb:Gravity:NorthWest 1)
+(defconst xcb:Gravity:North 2)
+(defconst xcb:Gravity:NorthEast 3)
+(defconst xcb:Gravity:West 4)
+(defconst xcb:Gravity:Center 5)
+(defconst xcb:Gravity:East 6)
+(defconst xcb:Gravity:SouthWest 7)
+(defconst xcb:Gravity:South 8)
+(defconst xcb:Gravity:SouthEast 9)
+(defconst xcb:Gravity:Static 10)
+
+(defclass xcb:CreateWindow
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (depth :initarg :depth :type xcb:CARD8)
+ (wid :initarg :wid :type xcb:WINDOW)
+ (parent :initarg :parent :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (border-width :initarg :border-width :type xcb:CARD16)
+ (class :initarg :class :type xcb:CARD16)
+ (visual :initarg :visual :type xcb:VISUALID)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 background-pixmap)
+ (2 background-pixel)
+ (4 border-pixmap)
+ (8 border-pixel)
+ (16 bit-gravity)
+ (32 win-gravity)
+ (64 backing-store)
+ (128 backing-planes)
+ (256 backing-pixel)
+ (512 override-redirect)
+ (1024 save-under)
+ (2048 event-mask)
+ (4096 do-not-propogate-mask)
+ (8192 colormap)
+ (16384 cursor)))
+ :type xcb:-switch)
+ (background-pixmap :initarg :background-pixmap :type xcb:PIXMAP)
+ (background-pixel :initarg :background-pixel :type xcb:CARD32)
+ (border-pixmap :initarg :border-pixmap :type xcb:PIXMAP)
+ (border-pixel :initarg :border-pixel :type xcb:CARD32)
+ (bit-gravity :initarg :bit-gravity :type xcb:CARD32)
+ (win-gravity :initarg :win-gravity :type xcb:CARD32)
+ (backing-store :initarg :backing-store :type xcb:CARD32)
+ (backing-planes :initarg :backing-planes :type xcb:CARD32)
+ (backing-pixel :initarg :backing-pixel :type xcb:CARD32)
+ (override-redirect :initarg :override-redirect :type xcb:BOOL32)
+ (save-under :initarg :save-under :type xcb:BOOL32)
+ (event-mask :initarg :event-mask :type xcb:CARD32)
+ (do-not-propogate-mask :initarg :do-not-propogate-mask :type xcb:CARD32)
+ (colormap :initarg :colormap :type xcb:COLORMAP)
+ (cursor :initarg :cursor :type xcb:CURSOR)))
+
+(defclass xcb:ChangeWindowAttributes
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 background-pixmap)
+ (2 background-pixel)
+ (4 border-pixmap)
+ (8 border-pixel)
+ (16 bit-gravity)
+ (32 win-gravity)
+ (64 backing-store)
+ (128 backing-planes)
+ (256 backing-pixel)
+ (512 override-redirect)
+ (1024 save-under)
+ (2048 event-mask)
+ (4096 do-not-propogate-mask)
+ (8192 colormap)
+ (16384 cursor)))
+ :type xcb:-switch)
+ (background-pixmap :initarg :background-pixmap :type xcb:PIXMAP)
+ (background-pixel :initarg :background-pixel :type xcb:CARD32)
+ (border-pixmap :initarg :border-pixmap :type xcb:PIXMAP)
+ (border-pixel :initarg :border-pixel :type xcb:CARD32)
+ (bit-gravity :initarg :bit-gravity :type xcb:CARD32)
+ (win-gravity :initarg :win-gravity :type xcb:CARD32)
+ (backing-store :initarg :backing-store :type xcb:CARD32)
+ (backing-planes :initarg :backing-planes :type xcb:CARD32)
+ (backing-pixel :initarg :backing-pixel :type xcb:CARD32)
+ (override-redirect :initarg :override-redirect :type xcb:BOOL32)
+ (save-under :initarg :save-under :type xcb:BOOL32)
+ (event-mask :initarg :event-mask :type xcb:CARD32)
+ (do-not-propogate-mask :initarg :do-not-propogate-mask :type xcb:CARD32)
+ (colormap :initarg :colormap :type xcb:COLORMAP)
+ (cursor :initarg :cursor :type xcb:CURSOR)))
+
+(defconst xcb:MapState:Unmapped 0)
+(defconst xcb:MapState:Unviewable 1)
+(defconst xcb:MapState:Viewable 2)
+
+(defclass xcb:GetWindowAttributes
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:GetWindowAttributes~reply
+ (xcb:-reply)
+ ((backing-store :initarg :backing-store :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (visual :initarg :visual :type xcb:VISUALID)
+ (class :initarg :class :type xcb:CARD16)
+ (bit-gravity :initarg :bit-gravity :type xcb:CARD8)
+ (win-gravity :initarg :win-gravity :type xcb:CARD8)
+ (backing-planes :initarg :backing-planes :type xcb:CARD32)
+ (backing-pixel :initarg :backing-pixel :type xcb:CARD32)
+ (save-under :initarg :save-under :type xcb:BOOL)
+ (map-is-installed :initarg :map-is-installed :type xcb:BOOL)
+ (map-state :initarg :map-state :type xcb:CARD8)
+ (override-redirect :initarg :override-redirect :type xcb:BOOL)
+ (colormap :initarg :colormap :type xcb:COLORMAP)
+ (all-event-masks :initarg :all-event-masks :type xcb:CARD32)
+ (your-event-mask :initarg :your-event-mask :type xcb:CARD32)
+ (do-not-propagate-mask :initarg :do-not-propagate-mask :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:DestroyWindow
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:DestroySubwindows
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defconst xcb:SetMode:Insert 0)
+(defconst xcb:SetMode:Delete 1)
+
+(defclass xcb:ChangeSaveSet
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:BYTE)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:ReparentWindow
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)
+ (parent :initarg :parent :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)))
+
+(defclass xcb:MapWindow
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:MapSubwindows
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:UnmapWindow
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:UnmapSubwindows
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defconst xcb:ConfigWindow:X 1)
+(defconst xcb:ConfigWindow:Y 2)
+(defconst xcb:ConfigWindow:Width 4)
+(defconst xcb:ConfigWindow:Height 8)
+(defconst xcb:ConfigWindow:BorderWidth 16)
+(defconst xcb:ConfigWindow:Sibling 32)
+(defconst xcb:ConfigWindow:StackMode 64)
+
+(defconst xcb:StackMode:Above 0)
+(defconst xcb:StackMode:Below 1)
+(defconst xcb:StackMode:TopIf 2)
+(defconst xcb:StackMode:BottomIf 3)
+(defconst xcb:StackMode:Opposite 4)
+
+(defclass xcb:ConfigureWindow
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)
+ (value-mask :initarg :value-mask :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 x)
+ (2 y)
+ (4 width)
+ (8 height)
+ (16 border-width)
+ (32 sibling)
+ (64 stack-mode)))
+ :type xcb:-switch)
+ (x :initarg :x :type xcb:INT32)
+ (y :initarg :y :type xcb:INT32)
+ (width :initarg :width :type xcb:CARD32)
+ (height :initarg :height :type xcb:CARD32)
+ (border-width :initarg :border-width :type xcb:CARD32)
+ (sibling :initarg :sibling :type xcb:WINDOW)
+ (stack-mode :initarg :stack-mode :type xcb:CARD32)))
+
+(defconst xcb:Circulate:RaiseLowest 0)
+(defconst xcb:Circulate:LowerHighest 1)
+
+(defclass xcb:CirculateWindow
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (direction :initarg :direction :type xcb:CARD8)
+ (window :initarg :window :type xcb:WINDOW)))
+
+(defclass xcb:GetGeometry
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+(defclass xcb:GetGeometry~reply
+ (xcb:-reply)
+ ((depth :initarg :depth :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (border-width :initarg :border-width :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:QueryTree
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:QueryTree~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (parent :initarg :parent :type xcb:WINDOW)
+ (children-len :initarg :children-len :type xcb:CARD16)
+ (pad~1 :initform 14 :type xcb:-pad)
+ (children~ :initform
+ '(name children type xcb:WINDOW size
+ (xcb:-fieldref 'children-len))
+ :type xcb:-list)
+ (children :initarg :children :type xcb:-ignore)))
+
+(defclass xcb:InternAtom
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (only-if-exists :initarg :only-if-exists :type xcb:BOOL)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+(defclass xcb:InternAtom~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (atom :initarg :atom :type xcb:ATOM)))
+
+(defclass xcb:GetAtomName
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (atom :initarg :atom :type xcb:ATOM)))
+(defclass xcb:GetAtomName~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defconst xcb:PropMode:Replace 0)
+(defconst xcb:PropMode:Prepend 1)
+(defconst xcb:PropMode:Append 2)
+
+(defclass xcb:ChangeProperty
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:CARD8)
+ (window :initarg :window :type xcb:WINDOW)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (format :initarg :format :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (data-len :initarg :data-len :type xcb:CARD32)
+ (data~ :initform
+ '(name data type xcb:void size
+ (/
+ (*
+ (xcb:-fieldref 'data-len)
+ (xcb:-fieldref 'format))
+ 8))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:DeleteProperty
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)
+ (property :initarg :property :type xcb:ATOM)))
+
+(defconst xcb:GetPropertyType:Any 0)
+
+(defclass xcb:GetProperty
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)
+ (delete :initarg :delete :type xcb:BOOL)
+ (window :initarg :window :type xcb:WINDOW)
+ (property :initarg :property :type xcb:ATOM)
+ (type :initarg :type :type xcb:ATOM)
+ (long-offset :initarg :long-offset :type xcb:CARD32)
+ (long-length :initarg :long-length :type xcb:CARD32)))
+(defclass xcb:GetProperty~reply
+ (xcb:-reply)
+ ((format :initarg :format :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (type :initarg :type :type xcb:ATOM)
+ (bytes-after :initarg :bytes-after :type xcb:CARD32)
+ (value-len :initarg :value-len :type xcb:CARD32)
+ (pad~0 :initform 12 :type xcb:-pad)
+ (value~ :initform
+ '(name value type xcb:void size
+ (*
+ (xcb:-fieldref 'value-len)
+ (/
+ (xcb:-fieldref 'format)
+ 8)))
+ :type xcb:-list)
+ (value :initarg :value :type xcb:-ignore)))
+
+(defclass xcb:ListProperties
+ (xcb:-request)
+ ((~opcode :initform 21 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:ListProperties~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (atoms-len :initarg :atoms-len :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (atoms~ :initform
+ '(name atoms type xcb:ATOM size
+ (xcb:-fieldref 'atoms-len))
+ :type xcb:-list)
+ (atoms :initarg :atoms :type xcb:-ignore)))
+
+(defclass xcb:SetSelectionOwner
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (owner :initarg :owner :type xcb:WINDOW)
+ (selection :initarg :selection :type xcb:ATOM)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+
+(defclass xcb:GetSelectionOwner
+ (xcb:-request)
+ ((~opcode :initform 23 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (selection :initarg :selection :type xcb:ATOM)))
+(defclass xcb:GetSelectionOwner~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (owner :initarg :owner :type xcb:WINDOW)))
+
+(defclass xcb:ConvertSelection
+ (xcb:-request)
+ ((~opcode :initform 24 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (requestor :initarg :requestor :type xcb:WINDOW)
+ (selection :initarg :selection :type xcb:ATOM)
+ (target :initarg :target :type xcb:ATOM)
+ (property :initarg :property :type xcb:ATOM)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+
+(defconst xcb:SendEventDest:PointerWindow 0)
+(defconst xcb:SendEventDest:ItemFocus 1)
+
+(defclass xcb:SendEvent
+ (xcb:-request)
+ ((~opcode :initform 25 :type xcb:-u1)
+ (propagate :initarg :propagate :type xcb:BOOL)
+ (destination :initarg :destination :type xcb:WINDOW)
+ (event-mask :initarg :event-mask :type xcb:CARD32)
+ (event~ :initform
+ '(name event type xcb:char size 32)
+ :type xcb:-list)
+ (event :initarg :event :type xcb:-ignore)))
+
+(defconst xcb:GrabMode:Sync 0)
+(defconst xcb:GrabMode:Async 1)
+
+(defconst xcb:GrabStatus:Success 0)
+(defconst xcb:GrabStatus:AlreadyGrabbed 1)
+(defconst xcb:GrabStatus:InvalidTime 2)
+(defconst xcb:GrabStatus:NotViewable 3)
+(defconst xcb:GrabStatus:Frozen 4)
+
+(defconst xcb:Cursor:None 0)
+
+(defclass xcb:GrabPointer
+ (xcb:-request)
+ ((~opcode :initform 26 :type xcb:-u1)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (event-mask :initarg :event-mask :type xcb:CARD16)
+ (pointer-mode :initarg :pointer-mode :type xcb:BYTE)
+ (keyboard-mode :initarg :keyboard-mode :type xcb:BYTE)
+ (confine-to :initarg :confine-to :type xcb:WINDOW)
+ (cursor :initarg :cursor :type xcb:CURSOR)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+(defclass xcb:GrabPointer~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:UngrabPointer
+ (xcb:-request)
+ ((~opcode :initform 27 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+
+(defconst xcb:ButtonIndex:Any 0)
+(defconst xcb:ButtonIndex:1 1)
+(defconst xcb:ButtonIndex:2 2)
+(defconst xcb:ButtonIndex:3 3)
+(defconst xcb:ButtonIndex:4 4)
+(defconst xcb:ButtonIndex:5 5)
+
+(defclass xcb:GrabButton
+ (xcb:-request)
+ ((~opcode :initform 28 :type xcb:-u1)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (event-mask :initarg :event-mask :type xcb:CARD16)
+ (pointer-mode :initarg :pointer-mode :type xcb:CARD8)
+ (keyboard-mode :initarg :keyboard-mode :type xcb:CARD8)
+ (confine-to :initarg :confine-to :type xcb:WINDOW)
+ (cursor :initarg :cursor :type xcb:CURSOR)
+ (button :initarg :button :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (modifiers :initarg :modifiers :type xcb:CARD16)))
+
+(defclass xcb:UngrabButton
+ (xcb:-request)
+ ((~opcode :initform 29 :type xcb:-u1)
+ (button :initarg :button :type xcb:CARD8)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (modifiers :initarg :modifiers :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:ChangeActivePointerGrab
+ (xcb:-request)
+ ((~opcode :initform 30 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cursor :initarg :cursor :type xcb:CURSOR)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (event-mask :initarg :event-mask :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:GrabKeyboard
+ (xcb:-request)
+ ((~opcode :initform 31 :type xcb:-u1)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (pointer-mode :initarg :pointer-mode :type xcb:BYTE)
+ (keyboard-mode :initarg :keyboard-mode :type xcb:BYTE)
+ (pad~0 :initform 2 :type xcb:-pad)))
+(defclass xcb:GrabKeyboard~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:UngrabKeyboard
+ (xcb:-request)
+ ((~opcode :initform 32 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+
+(defconst xcb:Grab:Any 0)
+
+(defclass xcb:GrabKey
+ (xcb:-request)
+ ((~opcode :initform 33 :type xcb:-u1)
+ (owner-events :initarg :owner-events :type xcb:BOOL)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (modifiers :initarg :modifiers :type xcb:CARD16)
+ (key :initarg :key :type xcb:KEYCODE)
+ (pointer-mode :initarg :pointer-mode :type xcb:CARD8)
+ (keyboard-mode :initarg :keyboard-mode :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:UngrabKey
+ (xcb:-request)
+ ((~opcode :initform 34 :type xcb:-u1)
+ (key :initarg :key :type xcb:KEYCODE)
+ (grab-window :initarg :grab-window :type xcb:WINDOW)
+ (modifiers :initarg :modifiers :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defconst xcb:Allow:AsyncPointer 0)
+(defconst xcb:Allow:SyncPointer 1)
+(defconst xcb:Allow:ReplayPointer 2)
+(defconst xcb:Allow:AsyncKeyboard 3)
+(defconst xcb:Allow:SyncKeyboard 4)
+(defconst xcb:Allow:ReplayKeyboard 5)
+(defconst xcb:Allow:AsyncBoth 6)
+(defconst xcb:Allow:SyncBoth 7)
+
+(defclass xcb:AllowEvents
+ (xcb:-request)
+ ((~opcode :initform 35 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:CARD8)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+
+(defclass xcb:GrabServer
+ (xcb:-request)
+ ((~opcode :initform 36 :type xcb:-u1)))
+
+(defclass xcb:UngrabServer
+ (xcb:-request)
+ ((~opcode :initform 37 :type xcb:-u1)))
+
+(defclass xcb:QueryPointer
+ (xcb:-request)
+ ((~opcode :initform 38 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:QueryPointer~reply
+ (xcb:-reply)
+ ((same-screen :initarg :same-screen :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (child :initarg :child :type xcb:WINDOW)
+ (root-x :initarg :root-x :type xcb:INT16)
+ (root-y :initarg :root-y :type xcb:INT16)
+ (win-x :initarg :win-x :type xcb:INT16)
+ (win-y :initarg :win-y :type xcb:INT16)
+ (mask :initarg :mask :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:TIMECOORD
+ (xcb:-struct)
+ ((time :initarg :time :type xcb:TIMESTAMP)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)))
+
+(defclass xcb:GetMotionEvents
+ (xcb:-request)
+ ((~opcode :initform 39 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)
+ (start :initarg :start :type xcb:TIMESTAMP)
+ (stop :initarg :stop :type xcb:TIMESTAMP)))
+(defclass xcb:GetMotionEvents~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (events-len :initarg :events-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (events~ :initform
+ '(name events type xcb:TIMECOORD size
+ (xcb:-fieldref 'events-len))
+ :type xcb:-list)
+ (events :initarg :events :type xcb:-ignore)))
+
+(defclass xcb:TranslateCoordinates
+ (xcb:-request)
+ ((~opcode :initform 40 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (src-window :initarg :src-window :type xcb:WINDOW)
+ (dst-window :initarg :dst-window :type xcb:WINDOW)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)))
+(defclass xcb:TranslateCoordinates~reply
+ (xcb:-reply)
+ ((same-screen :initarg :same-screen :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (child :initarg :child :type xcb:WINDOW)
+ (dst-x :initarg :dst-x :type xcb:INT16)
+ (dst-y :initarg :dst-y :type xcb:INT16)))
+
+(defclass xcb:WarpPointer
+ (xcb:-request)
+ ((~opcode :initform 41 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (src-window :initarg :src-window :type xcb:WINDOW)
+ (dst-window :initarg :dst-window :type xcb:WINDOW)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (src-width :initarg :src-width :type xcb:CARD16)
+ (src-height :initarg :src-height :type xcb:CARD16)
+ (dst-x :initarg :dst-x :type xcb:INT16)
+ (dst-y :initarg :dst-y :type xcb:INT16)))
+
+(defconst xcb:InputFocus:None 0)
+(defconst xcb:InputFocus:PointerRoot 1)
+(defconst xcb:InputFocus:Parent 2)
+(defconst xcb:InputFocus:FollowKeyboard 3)
+
+(defclass xcb:SetInputFocus
+ (xcb:-request)
+ ((~opcode :initform 42 :type xcb:-u1)
+ (revert-to :initarg :revert-to :type xcb:CARD8)
+ (focus :initarg :focus :type xcb:WINDOW)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+
+(defclass xcb:GetInputFocus
+ (xcb:-request)
+ ((~opcode :initform 43 :type xcb:-u1)))
+(defclass xcb:GetInputFocus~reply
+ (xcb:-reply)
+ ((revert-to :initarg :revert-to :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (focus :initarg :focus :type xcb:WINDOW)))
+
+(defclass xcb:QueryKeymap
+ (xcb:-request)
+ ((~opcode :initform 44 :type xcb:-u1)))
+(defclass xcb:QueryKeymap~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (keys~ :initform
+ '(name keys type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (keys :initarg :keys :type xcb:-ignore)))
+
+(defclass xcb:OpenFont
+ (xcb:-request)
+ ((~opcode :initform 45 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (fid :initarg :fid :type xcb:FONT)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:CloseFont
+ (xcb:-request)
+ ((~opcode :initform 46 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (font :initarg :font :type xcb:FONT)))
+
+(defconst xcb:FontDraw:LeftToRight 0)
+(defconst xcb:FontDraw:RightToLeft 1)
+
+(defclass xcb:FONTPROP
+ (xcb:-struct)
+ ((name :initarg :name :type xcb:ATOM)
+ (value :initarg :value :type xcb:CARD32)))
+
+(defclass xcb:CHARINFO
+ (xcb:-struct)
+ ((left-side-bearing :initarg :left-side-bearing :type xcb:INT16)
+ (right-side-bearing :initarg :right-side-bearing :type xcb:INT16)
+ (character-width :initarg :character-width :type xcb:INT16)
+ (ascent :initarg :ascent :type xcb:INT16)
+ (descent :initarg :descent :type xcb:INT16)
+ (attributes :initarg :attributes :type xcb:CARD16)))
+
+(defclass xcb:QueryFont
+ (xcb:-request)
+ ((~opcode :initform 47 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (font :initarg :font :type xcb:FONTABLE)))
+(defclass xcb:QueryFont~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (min-bounds :initarg :min-bounds :type xcb:CHARINFO)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (max-bounds :initarg :max-bounds :type xcb:CHARINFO)
+ (pad~2 :initform 4 :type xcb:-pad)
+ (min-char-or-byte2 :initarg :min-char-or-byte2 :type xcb:CARD16)
+ (max-char-or-byte2 :initarg :max-char-or-byte2 :type xcb:CARD16)
+ (default-char :initarg :default-char :type xcb:CARD16)
+ (properties-len :initarg :properties-len :type xcb:CARD16)
+ (draw-direction :initarg :draw-direction :type xcb:BYTE)
+ (min-byte1 :initarg :min-byte1 :type xcb:CARD8)
+ (max-byte1 :initarg :max-byte1 :type xcb:CARD8)
+ (all-chars-exist :initarg :all-chars-exist :type xcb:BOOL)
+ (font-ascent :initarg :font-ascent :type xcb:INT16)
+ (font-descent :initarg :font-descent :type xcb:INT16)
+ (char-infos-len :initarg :char-infos-len :type xcb:CARD32)
+ (properties~ :initform
+ '(name properties type xcb:FONTPROP size
+ (xcb:-fieldref 'properties-len))
+ :type xcb:-list)
+ (properties :initarg :properties :type xcb:-ignore)
+ (char-infos~ :initform
+ '(name char-infos type xcb:CHARINFO size
+ (xcb:-fieldref 'char-infos-len))
+ :type xcb:-list)
+ (char-infos :initarg :char-infos :type xcb:-ignore)))
+
+(defclass xcb:QueryTextExtents
+ (xcb:-request)
+ ((~opcode :initform 48 :type xcb:-u1)
+ (odd-length :type xcb:BOOL)
+ (font :initarg :font :type xcb:FONTABLE)
+ (string~ :initform
+ '(name string type xcb:CHAR2B size nil)
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)))
+(cl-defmethod xcb:marshal
+ ((obj xcb:QueryTextExtents))
+ nil
+ (setf
+ (slot-value obj 'odd-length)
+ (logand
+ (length
+ (xcb:-fieldref 'string))
+ 1))
+ (cl-call-next-method obj))
+(defclass xcb:QueryTextExtents~reply
+ (xcb:-reply)
+ ((draw-direction :initarg :draw-direction :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (font-ascent :initarg :font-ascent :type xcb:INT16)
+ (font-descent :initarg :font-descent :type xcb:INT16)
+ (overall-ascent :initarg :overall-ascent :type xcb:INT16)
+ (overall-descent :initarg :overall-descent :type xcb:INT16)
+ (overall-width :initarg :overall-width :type xcb:INT32)
+ (overall-left :initarg :overall-left :type xcb:INT32)
+ (overall-right :initarg :overall-right :type xcb:INT32)))
+
+(defclass xcb:STR
+ (xcb:-struct)
+ ((name-len :initarg :name-len :type xcb:CARD8)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:ListFonts
+ (xcb:-request)
+ ((~opcode :initform 49 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (max-names :initarg :max-names :type xcb:CARD16)
+ (pattern-len :initarg :pattern-len :type xcb:CARD16)
+ (pattern~ :initform
+ '(name pattern type xcb:char size
+ (xcb:-fieldref 'pattern-len))
+ :type xcb:-list)
+ (pattern :initarg :pattern :type xcb:-ignore)))
+(defclass xcb:ListFonts~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (names-len :initarg :names-len :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (names~ :initform
+ '(name names type xcb:STR size
+ (xcb:-fieldref 'names-len))
+ :type xcb:-list)
+ (names :initarg :names :type xcb:-ignore)))
+
+(defclass xcb:ListFontsWithInfo
+ (xcb:-request)
+ ((~opcode :initform 50 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (max-names :initarg :max-names :type xcb:CARD16)
+ (pattern-len :initarg :pattern-len :type xcb:CARD16)
+ (pattern~ :initform
+ '(name pattern type xcb:char size
+ (xcb:-fieldref 'pattern-len))
+ :type xcb:-list)
+ (pattern :initarg :pattern :type xcb:-ignore)))
+(defclass xcb:ListFontsWithInfo~reply
+ (xcb:-reply)
+ ((name-len :initarg :name-len :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (min-bounds :initarg :min-bounds :type xcb:CHARINFO)
+ (pad~0 :initform 4 :type xcb:-pad)
+ (max-bounds :initarg :max-bounds :type xcb:CHARINFO)
+ (pad~1 :initform 4 :type xcb:-pad)
+ (min-char-or-byte2 :initarg :min-char-or-byte2 :type xcb:CARD16)
+ (max-char-or-byte2 :initarg :max-char-or-byte2 :type xcb:CARD16)
+ (default-char :initarg :default-char :type xcb:CARD16)
+ (properties-len :initarg :properties-len :type xcb:CARD16)
+ (draw-direction :initarg :draw-direction :type xcb:BYTE)
+ (min-byte1 :initarg :min-byte1 :type xcb:CARD8)
+ (max-byte1 :initarg :max-byte1 :type xcb:CARD8)
+ (all-chars-exist :initarg :all-chars-exist :type xcb:BOOL)
+ (font-ascent :initarg :font-ascent :type xcb:INT16)
+ (font-descent :initarg :font-descent :type xcb:INT16)
+ (replies-hint :initarg :replies-hint :type xcb:CARD32)
+ (properties~ :initform
+ '(name properties type xcb:FONTPROP size
+ (xcb:-fieldref 'properties-len))
+ :type xcb:-list)
+ (properties :initarg :properties :type xcb:-ignore)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:SetFontPath
+ (xcb:-request)
+ ((~opcode :initform 51 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (font-qty :initarg :font-qty :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (font~ :initform
+ '(name font type xcb:STR size
+ (xcb:-fieldref 'font-qty))
+ :type xcb:-list)
+ (font :initarg :font :type xcb:-ignore)))
+
+(defclass xcb:GetFontPath
+ (xcb:-request)
+ ((~opcode :initform 52 :type xcb:-u1)))
+(defclass xcb:GetFontPath~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (path-len :initarg :path-len :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (path~ :initform
+ '(name path type xcb:STR size
+ (xcb:-fieldref 'path-len))
+ :type xcb:-list)
+ (path :initarg :path :type xcb:-ignore)))
+
+(defclass xcb:CreatePixmap
+ (xcb:-request)
+ ((~opcode :initform 53 :type xcb:-u1)
+ (depth :initarg :depth :type xcb:CARD8)
+ (pid :initarg :pid :type xcb:PIXMAP)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defclass xcb:FreePixmap
+ (xcb:-request)
+ ((~opcode :initform 54 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (pixmap :initarg :pixmap :type xcb:PIXMAP)))
+
+(defconst xcb:GC:Function 1)
+(defconst xcb:GC:PlaneMask 2)
+(defconst xcb:GC:Foreground 4)
+(defconst xcb:GC:Background 8)
+(defconst xcb:GC:LineWidth 16)
+(defconst xcb:GC:LineStyle 32)
+(defconst xcb:GC:CapStyle 64)
+(defconst xcb:GC:JoinStyle 128)
+(defconst xcb:GC:FillStyle 256)
+(defconst xcb:GC:FillRule 512)
+(defconst xcb:GC:Tile 1024)
+(defconst xcb:GC:Stipple 2048)
+(defconst xcb:GC:TileStippleOriginX 4096)
+(defconst xcb:GC:TileStippleOriginY 8192)
+(defconst xcb:GC:Font 16384)
+(defconst xcb:GC:SubwindowMode 32768)
+(defconst xcb:GC:GraphicsExposures 65536)
+(defconst xcb:GC:ClipOriginX 131072)
+(defconst xcb:GC:ClipOriginY 262144)
+(defconst xcb:GC:ClipMask 524288)
+(defconst xcb:GC:DashOffset 1048576)
+(defconst xcb:GC:DashList 2097152)
+(defconst xcb:GC:ArcMode 4194304)
+
+(defconst xcb:GX:clear 0)
+(defconst xcb:GX:and 1)
+(defconst xcb:GX:andReverse 2)
+(defconst xcb:GX:copy 3)
+(defconst xcb:GX:andInverted 4)
+(defconst xcb:GX:noop 5)
+(defconst xcb:GX:xor 6)
+(defconst xcb:GX:or 7)
+(defconst xcb:GX:nor 8)
+(defconst xcb:GX:equiv 9)
+(defconst xcb:GX:invert 10)
+(defconst xcb:GX:orReverse 11)
+(defconst xcb:GX:copyInverted 12)
+(defconst xcb:GX:orInverted 13)
+(defconst xcb:GX:nand 14)
+(defconst xcb:GX:set 15)
+
+(defconst xcb:LineStyle:Solid 0)
+(defconst xcb:LineStyle:OnOffDash 1)
+(defconst xcb:LineStyle:DoubleDash 2)
+
+(defconst xcb:CapStyle:NotLast 0)
+(defconst xcb:CapStyle:Butt 1)
+(defconst xcb:CapStyle:Round 2)
+(defconst xcb:CapStyle:Projecting 3)
+
+(defconst xcb:JoinStyle:Miter 0)
+(defconst xcb:JoinStyle:Round 1)
+(defconst xcb:JoinStyle:Bevel 2)
+
+(defconst xcb:FillStyle:Solid 0)
+(defconst xcb:FillStyle:Tiled 1)
+(defconst xcb:FillStyle:Stippled 2)
+(defconst xcb:FillStyle:OpaqueStippled 3)
+
+(defconst xcb:FillRule:EvenOdd 0)
+(defconst xcb:FillRule:Winding 1)
+
+(defconst xcb:SubwindowMode:ClipByChildren 0)
+(defconst xcb:SubwindowMode:IncludeInferiors 1)
+
+(defconst xcb:ArcMode:Chord 0)
+(defconst xcb:ArcMode:PieSlice 1)
+
+(defclass xcb:CreateGC
+ (xcb:-request)
+ ((~opcode :initform 55 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cid :initarg :cid :type xcb:GCONTEXT)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 function)
+ (2 plane-mask)
+ (4 foreground)
+ (8 background)
+ (16 line-width)
+ (32 line-style)
+ (64 cap-style)
+ (128 join-style)
+ (256 fill-style)
+ (512 fill-rule)
+ (1024 tile)
+ (2048 stipple)
+ (4096 tile-stipple-x-origin)
+ (8192 tile-stipple-y-origin)
+ (16384 font)
+ (32768 subwindow-mode)
+ (65536 graphics-exposures)
+ (131072 clip-x-origin)
+ (262144 clip-y-origin)
+ (524288 clip-mask)
+ (1048576 dash-offset)
+ (2097152 dashes)
+ (4194304 arc-mode)))
+ :type xcb:-switch)
+ (function :initarg :function :type xcb:CARD32)
+ (plane-mask :initarg :plane-mask :type xcb:CARD32)
+ (foreground :initarg :foreground :type xcb:CARD32)
+ (background :initarg :background :type xcb:CARD32)
+ (line-width :initarg :line-width :type xcb:CARD32)
+ (line-style :initarg :line-style :type xcb:CARD32)
+ (cap-style :initarg :cap-style :type xcb:CARD32)
+ (join-style :initarg :join-style :type xcb:CARD32)
+ (fill-style :initarg :fill-style :type xcb:CARD32)
+ (fill-rule :initarg :fill-rule :type xcb:CARD32)
+ (tile :initarg :tile :type xcb:PIXMAP)
+ (stipple :initarg :stipple :type xcb:PIXMAP)
+ (tile-stipple-x-origin :initarg :tile-stipple-x-origin :type xcb:INT32)
+ (tile-stipple-y-origin :initarg :tile-stipple-y-origin :type xcb:INT32)
+ (font :initarg :font :type xcb:FONT)
+ (subwindow-mode :initarg :subwindow-mode :type xcb:CARD32)
+ (graphics-exposures :initarg :graphics-exposures :type xcb:BOOL32)
+ (clip-x-origin :initarg :clip-x-origin :type xcb:INT32)
+ (clip-y-origin :initarg :clip-y-origin :type xcb:INT32)
+ (clip-mask :initarg :clip-mask :type xcb:PIXMAP)
+ (dash-offset :initarg :dash-offset :type xcb:CARD32)
+ (dashes :initarg :dashes :type xcb:CARD32)
+ (arc-mode :initarg :arc-mode :type xcb:CARD32)))
+
+(defclass xcb:ChangeGC
+ (xcb:-request)
+ ((~opcode :initform 56 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 function)
+ (2 plane-mask)
+ (4 foreground)
+ (8 background)
+ (16 line-width)
+ (32 line-style)
+ (64 cap-style)
+ (128 join-style)
+ (256 fill-style)
+ (512 fill-rule)
+ (1024 tile)
+ (2048 stipple)
+ (4096 tile-stipple-x-origin)
+ (8192 tile-stipple-y-origin)
+ (16384 font)
+ (32768 subwindow-mode)
+ (65536 graphics-exposures)
+ (131072 clip-x-origin)
+ (262144 clip-y-origin)
+ (524288 clip-mask)
+ (1048576 dash-offset)
+ (2097152 dashes)
+ (4194304 arc-mode)))
+ :type xcb:-switch)
+ (function :initarg :function :type xcb:CARD32)
+ (plane-mask :initarg :plane-mask :type xcb:CARD32)
+ (foreground :initarg :foreground :type xcb:CARD32)
+ (background :initarg :background :type xcb:CARD32)
+ (line-width :initarg :line-width :type xcb:CARD32)
+ (line-style :initarg :line-style :type xcb:CARD32)
+ (cap-style :initarg :cap-style :type xcb:CARD32)
+ (join-style :initarg :join-style :type xcb:CARD32)
+ (fill-style :initarg :fill-style :type xcb:CARD32)
+ (fill-rule :initarg :fill-rule :type xcb:CARD32)
+ (tile :initarg :tile :type xcb:PIXMAP)
+ (stipple :initarg :stipple :type xcb:PIXMAP)
+ (tile-stipple-x-origin :initarg :tile-stipple-x-origin :type xcb:INT32)
+ (tile-stipple-y-origin :initarg :tile-stipple-y-origin :type xcb:INT32)
+ (font :initarg :font :type xcb:FONT)
+ (subwindow-mode :initarg :subwindow-mode :type xcb:CARD32)
+ (graphics-exposures :initarg :graphics-exposures :type xcb:BOOL32)
+ (clip-x-origin :initarg :clip-x-origin :type xcb:INT32)
+ (clip-y-origin :initarg :clip-y-origin :type xcb:INT32)
+ (clip-mask :initarg :clip-mask :type xcb:PIXMAP)
+ (dash-offset :initarg :dash-offset :type xcb:CARD32)
+ (dashes :initarg :dashes :type xcb:CARD32)
+ (arc-mode :initarg :arc-mode :type xcb:CARD32)))
+
+(defclass xcb:CopyGC
+ (xcb:-request)
+ ((~opcode :initform 57 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (src-gc :initarg :src-gc :type xcb:GCONTEXT)
+ (dst-gc :initarg :dst-gc :type xcb:GCONTEXT)
+ (value-mask :initarg :value-mask :type xcb:CARD32)))
+
+(defclass xcb:SetDashes
+ (xcb:-request)
+ ((~opcode :initform 58 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (dash-offset :initarg :dash-offset :type xcb:CARD16)
+ (dashes-len :initarg :dashes-len :type xcb:CARD16)
+ (dashes~ :initform
+ '(name dashes type xcb:CARD8 size
+ (xcb:-fieldref 'dashes-len))
+ :type xcb:-list)
+ (dashes :initarg :dashes :type xcb:-ignore)))
+
+(defconst xcb:ClipOrdering:Unsorted 0)
+(defconst xcb:ClipOrdering:YSorted 1)
+(defconst xcb:ClipOrdering:YXSorted 2)
+(defconst xcb:ClipOrdering:YXBanded 3)
+
+(defclass xcb:SetClipRectangles
+ (xcb:-request)
+ ((~opcode :initform 59 :type xcb:-u1)
+ (ordering :initarg :ordering :type xcb:BYTE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (clip-x-origin :initarg :clip-x-origin :type xcb:INT16)
+ (clip-y-origin :initarg :clip-y-origin :type xcb:INT16)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size nil)
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defclass xcb:FreeGC
+ (xcb:-request)
+ ((~opcode :initform 60 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (gc :initarg :gc :type xcb:GCONTEXT)))
+
+(defclass xcb:ClearArea
+ (xcb:-request)
+ ((~opcode :initform 61 :type xcb:-u1)
+ (exposures :initarg :exposures :type xcb:BOOL)
+ (window :initarg :window :type xcb:WINDOW)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defclass xcb:CopyArea
+ (xcb:-request)
+ ((~opcode :initform 62 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (src-drawable :initarg :src-drawable :type xcb:DRAWABLE)
+ (dst-drawable :initarg :dst-drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (dst-x :initarg :dst-x :type xcb:INT16)
+ (dst-y :initarg :dst-y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defclass xcb:CopyPlane
+ (xcb:-request)
+ ((~opcode :initform 63 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (src-drawable :initarg :src-drawable :type xcb:DRAWABLE)
+ (dst-drawable :initarg :dst-drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (dst-x :initarg :dst-x :type xcb:INT16)
+ (dst-y :initarg :dst-y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (bit-plane :initarg :bit-plane :type xcb:CARD32)))
+
+(defconst xcb:CoordMode:Origin 0)
+(defconst xcb:CoordMode:Previous 1)
+
+(defclass xcb:PolyPoint
+ (xcb:-request)
+ ((~opcode :initform 64 :type xcb:-u1)
+ (coordinate-mode :initarg :coordinate-mode :type xcb:BYTE)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (points~ :initform
+ '(name points type xcb:POINT size nil)
+ :type xcb:-list)
+ (points :initarg :points :type xcb:-ignore)))
+
+(defclass xcb:PolyLine
+ (xcb:-request)
+ ((~opcode :initform 65 :type xcb:-u1)
+ (coordinate-mode :initarg :coordinate-mode :type xcb:BYTE)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (points~ :initform
+ '(name points type xcb:POINT size nil)
+ :type xcb:-list)
+ (points :initarg :points :type xcb:-ignore)))
+
+(defclass xcb:SEGMENT
+ (xcb:-struct)
+ ((x1 :initarg :x1 :type xcb:INT16)
+ (y1 :initarg :y1 :type xcb:INT16)
+ (x2 :initarg :x2 :type xcb:INT16)
+ (y2 :initarg :y2 :type xcb:INT16)))
+
+(defclass xcb:PolySegment
+ (xcb:-request)
+ ((~opcode :initform 66 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (segments~ :initform
+ '(name segments type xcb:SEGMENT size nil)
+ :type xcb:-list)
+ (segments :initarg :segments :type xcb:-ignore)))
+
+(defclass xcb:PolyRectangle
+ (xcb:-request)
+ ((~opcode :initform 67 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size nil)
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defclass xcb:PolyArc
+ (xcb:-request)
+ ((~opcode :initform 68 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (arcs~ :initform
+ '(name arcs type xcb:ARC size nil)
+ :type xcb:-list)
+ (arcs :initarg :arcs :type xcb:-ignore)))
+
+(defconst xcb:PolyShape:Complex 0)
+(defconst xcb:PolyShape:Nonconvex 1)
+(defconst xcb:PolyShape:Convex 2)
+
+(defclass xcb:FillPoly
+ (xcb:-request)
+ ((~opcode :initform 69 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (shape :initarg :shape :type xcb:CARD8)
+ (coordinate-mode :initarg :coordinate-mode :type xcb:CARD8)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (points~ :initform
+ '(name points type xcb:POINT size nil)
+ :type xcb:-list)
+ (points :initarg :points :type xcb:-ignore)))
+
+(defclass xcb:PolyFillRectangle
+ (xcb:-request)
+ ((~opcode :initform 70 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (rectangles~ :initform
+ '(name rectangles type xcb:RECTANGLE size nil)
+ :type xcb:-list)
+ (rectangles :initarg :rectangles :type xcb:-ignore)))
+
+(defclass xcb:PolyFillArc
+ (xcb:-request)
+ ((~opcode :initform 71 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (arcs~ :initform
+ '(name arcs type xcb:ARC size nil)
+ :type xcb:-list)
+ (arcs :initarg :arcs :type xcb:-ignore)))
+
+(defconst xcb:ImageFormat:XYBitmap 0)
+(defconst xcb:ImageFormat:XYPixmap 1)
+(defconst xcb:ImageFormat:ZPixmap 2)
+
+(defclass xcb:PutImage
+ (xcb:-request)
+ ((~opcode :initform 72 :type xcb:-u1)
+ (format :initarg :format :type xcb:CARD8)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (dst-x :initarg :dst-x :type xcb:INT16)
+ (dst-y :initarg :dst-y :type xcb:INT16)
+ (left-pad :initarg :left-pad :type xcb:CARD8)
+ (depth :initarg :depth :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size nil)
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:GetImage
+ (xcb:-request)
+ ((~opcode :initform 73 :type xcb:-u1)
+ (format :initarg :format :type xcb:CARD8)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (plane-mask :initarg :plane-mask :type xcb:CARD32)))
+(defclass xcb:GetImage~reply
+ (xcb:-reply)
+ ((depth :initarg :depth :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (visual :initarg :visual :type xcb:VISUALID)
+ (pad~0 :initform 20 :type xcb:-pad)
+ (data~ :initform
+ '(name data type xcb:BYTE size
+ (*
+ (xcb:-fieldref 'length)
+ 4))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:PolyText8
+ (xcb:-request)
+ ((~opcode :initform 74 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (items~ :initform
+ '(name items type xcb:BYTE size nil)
+ :type xcb:-list)
+ (items :initarg :items :type xcb:-ignore)))
+
+(defclass xcb:PolyText16
+ (xcb:-request)
+ ((~opcode :initform 75 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (items~ :initform
+ '(name items type xcb:BYTE size nil)
+ :type xcb:-list)
+ (items :initarg :items :type xcb:-ignore)))
+
+(defclass xcb:ImageText8
+ (xcb:-request)
+ ((~opcode :initform 76 :type xcb:-u1)
+ (string-len :initarg :string-len :type xcb:BYTE)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (string~ :initform
+ '(name string type xcb:char size
+ (xcb:-fieldref 'string-len))
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)))
+
+(defclass xcb:ImageText16
+ (xcb:-request)
+ ((~opcode :initform 77 :type xcb:-u1)
+ (string-len :initarg :string-len :type xcb:BYTE)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (x :initarg :x :type xcb:INT16)
+ (y :initarg :y :type xcb:INT16)
+ (string~ :initform
+ '(name string type xcb:CHAR2B size
+ (xcb:-fieldref 'string-len))
+ :type xcb:-list)
+ (string :initarg :string :type xcb:-ignore)))
+
+(defconst xcb:ColormapAlloc:None 0)
+(defconst xcb:ColormapAlloc:All 1)
+
+(defclass xcb:CreateColormap
+ (xcb:-request)
+ ((~opcode :initform 78 :type xcb:-u1)
+ (alloc :initarg :alloc :type xcb:BYTE)
+ (mid :initarg :mid :type xcb:COLORMAP)
+ (window :initarg :window :type xcb:WINDOW)
+ (visual :initarg :visual :type xcb:VISUALID)))
+
+(defclass xcb:FreeColormap
+ (xcb:-request)
+ ((~opcode :initform 79 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)))
+
+(defclass xcb:CopyColormapAndFree
+ (xcb:-request)
+ ((~opcode :initform 80 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (mid :initarg :mid :type xcb:COLORMAP)
+ (src-cmap :initarg :src-cmap :type xcb:COLORMAP)))
+
+(defclass xcb:InstallColormap
+ (xcb:-request)
+ ((~opcode :initform 81 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)))
+
+(defclass xcb:UninstallColormap
+ (xcb:-request)
+ ((~opcode :initform 82 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)))
+
+(defclass xcb:ListInstalledColormaps
+ (xcb:-request)
+ ((~opcode :initform 83 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:ListInstalledColormaps~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (cmaps-len :initarg :cmaps-len :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (cmaps~ :initform
+ '(name cmaps type xcb:COLORMAP size
+ (xcb:-fieldref 'cmaps-len))
+ :type xcb:-list)
+ (cmaps :initarg :cmaps :type xcb:-ignore)))
+
+(defclass xcb:AllocColor
+ (xcb:-request)
+ ((~opcode :initform 84 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (red :initarg :red :type xcb:CARD16)
+ (green :initarg :green :type xcb:CARD16)
+ (blue :initarg :blue :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)))
+(defclass xcb:AllocColor~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (red :initarg :red :type xcb:CARD16)
+ (green :initarg :green :type xcb:CARD16)
+ (blue :initarg :blue :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (pixel :initarg :pixel :type xcb:CARD32)))
+
+(defclass xcb:AllocNamedColor
+ (xcb:-request)
+ ((~opcode :initform 85 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+(defclass xcb:AllocNamedColor~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pixel :initarg :pixel :type xcb:CARD32)
+ (exact-red :initarg :exact-red :type xcb:CARD16)
+ (exact-green :initarg :exact-green :type xcb:CARD16)
+ (exact-blue :initarg :exact-blue :type xcb:CARD16)
+ (visual-red :initarg :visual-red :type xcb:CARD16)
+ (visual-green :initarg :visual-green :type xcb:CARD16)
+ (visual-blue :initarg :visual-blue :type xcb:CARD16)))
+
+(defclass xcb:AllocColorCells
+ (xcb:-request)
+ ((~opcode :initform 86 :type xcb:-u1)
+ (contiguous :initarg :contiguous :type xcb:BOOL)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (colors :initarg :colors :type xcb:CARD16)
+ (planes :initarg :planes :type xcb:CARD16)))
+(defclass xcb:AllocColorCells~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pixels-len :initarg :pixels-len :type xcb:CARD16)
+ (masks-len :initarg :masks-len :type xcb:CARD16)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (pixels~ :initform
+ '(name pixels type xcb:CARD32 size
+ (xcb:-fieldref 'pixels-len))
+ :type xcb:-list)
+ (pixels :initarg :pixels :type xcb:-ignore)
+ (masks~ :initform
+ '(name masks type xcb:CARD32 size
+ (xcb:-fieldref 'masks-len))
+ :type xcb:-list)
+ (masks :initarg :masks :type xcb:-ignore)))
+
+(defclass xcb:AllocColorPlanes
+ (xcb:-request)
+ ((~opcode :initform 87 :type xcb:-u1)
+ (contiguous :initarg :contiguous :type xcb:BOOL)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (colors :initarg :colors :type xcb:CARD16)
+ (reds :initarg :reds :type xcb:CARD16)
+ (greens :initarg :greens :type xcb:CARD16)
+ (blues :initarg :blues :type xcb:CARD16)))
+(defclass xcb:AllocColorPlanes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pixels-len :initarg :pixels-len :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (red-mask :initarg :red-mask :type xcb:CARD32)
+ (green-mask :initarg :green-mask :type xcb:CARD32)
+ (blue-mask :initarg :blue-mask :type xcb:CARD32)
+ (pad~2 :initform 8 :type xcb:-pad)
+ (pixels~ :initform
+ '(name pixels type xcb:CARD32 size
+ (xcb:-fieldref 'pixels-len))
+ :type xcb:-list)
+ (pixels :initarg :pixels :type xcb:-ignore)))
+
+(defclass xcb:FreeColors
+ (xcb:-request)
+ ((~opcode :initform 88 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (plane-mask :initarg :plane-mask :type xcb:CARD32)
+ (pixels~ :initform
+ '(name pixels type xcb:CARD32 size nil)
+ :type xcb:-list)
+ (pixels :initarg :pixels :type xcb:-ignore)))
+
+(defconst xcb:ColorFlag:Red 1)
+(defconst xcb:ColorFlag:Green 2)
+(defconst xcb:ColorFlag:Blue 4)
+
+(defclass xcb:COLORITEM
+ (xcb:-struct)
+ ((pixel :initarg :pixel :type xcb:CARD32)
+ (red :initarg :red :type xcb:CARD16)
+ (green :initarg :green :type xcb:CARD16)
+ (blue :initarg :blue :type xcb:CARD16)
+ (flags :initarg :flags :type xcb:BYTE)
+ (pad~0 :initform 1 :type xcb:-pad)))
+
+(defclass xcb:StoreColors
+ (xcb:-request)
+ ((~opcode :initform 89 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (items~ :initform
+ '(name items type xcb:COLORITEM size nil)
+ :type xcb:-list)
+ (items :initarg :items :type xcb:-ignore)))
+
+(defclass xcb:StoreNamedColor
+ (xcb:-request)
+ ((~opcode :initform 90 :type xcb:-u1)
+ (flags :initarg :flags :type xcb:CARD8)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (pixel :initarg :pixel :type xcb:CARD32)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+
+(defclass xcb:RGB
+ (xcb:-struct)
+ ((red :initarg :red :type xcb:CARD16)
+ (green :initarg :green :type xcb:CARD16)
+ (blue :initarg :blue :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)))
+
+(defclass xcb:QueryColors
+ (xcb:-request)
+ ((~opcode :initform 91 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (pixels~ :initform
+ '(name pixels type xcb:CARD32 size nil)
+ :type xcb:-list)
+ (pixels :initarg :pixels :type xcb:-ignore)))
+(defclass xcb:QueryColors~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (colors-len :initarg :colors-len :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (colors~ :initform
+ '(name colors type xcb:RGB size
+ (xcb:-fieldref 'colors-len))
+ :type xcb:-list)
+ (colors :initarg :colors :type xcb:-ignore)))
+
+(defclass xcb:LookupColor
+ (xcb:-request)
+ ((~opcode :initform 92 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cmap :initarg :cmap :type xcb:COLORMAP)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+(defclass xcb:LookupColor~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (exact-red :initarg :exact-red :type xcb:CARD16)
+ (exact-green :initarg :exact-green :type xcb:CARD16)
+ (exact-blue :initarg :exact-blue :type xcb:CARD16)
+ (visual-red :initarg :visual-red :type xcb:CARD16)
+ (visual-green :initarg :visual-green :type xcb:CARD16)
+ (visual-blue :initarg :visual-blue :type xcb:CARD16)))
+
+(defconst xcb:Pixmap:None 0)
+
+(defclass xcb:CreateCursor
+ (xcb:-request)
+ ((~opcode :initform 93 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cid :initarg :cid :type xcb:CURSOR)
+ (source :initarg :source :type xcb:PIXMAP)
+ (mask :initarg :mask :type xcb:PIXMAP)
+ (fore-red :initarg :fore-red :type xcb:CARD16)
+ (fore-green :initarg :fore-green :type xcb:CARD16)
+ (fore-blue :initarg :fore-blue :type xcb:CARD16)
+ (back-red :initarg :back-red :type xcb:CARD16)
+ (back-green :initarg :back-green :type xcb:CARD16)
+ (back-blue :initarg :back-blue :type xcb:CARD16)
+ (x :initarg :x :type xcb:CARD16)
+ (y :initarg :y :type xcb:CARD16)))
+
+(defconst xcb:Font:None 0)
+
+(defclass xcb:CreateGlyphCursor
+ (xcb:-request)
+ ((~opcode :initform 94 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cid :initarg :cid :type xcb:CURSOR)
+ (source-font :initarg :source-font :type xcb:FONT)
+ (mask-font :initarg :mask-font :type xcb:FONT)
+ (source-char :initarg :source-char :type xcb:CARD16)
+ (mask-char :initarg :mask-char :type xcb:CARD16)
+ (fore-red :initarg :fore-red :type xcb:CARD16)
+ (fore-green :initarg :fore-green :type xcb:CARD16)
+ (fore-blue :initarg :fore-blue :type xcb:CARD16)
+ (back-red :initarg :back-red :type xcb:CARD16)
+ (back-green :initarg :back-green :type xcb:CARD16)
+ (back-blue :initarg :back-blue :type xcb:CARD16)))
+
+(defclass xcb:FreeCursor
+ (xcb:-request)
+ ((~opcode :initform 95 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cursor :initarg :cursor :type xcb:CURSOR)))
+
+(defclass xcb:RecolorCursor
+ (xcb:-request)
+ ((~opcode :initform 96 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (cursor :initarg :cursor :type xcb:CURSOR)
+ (fore-red :initarg :fore-red :type xcb:CARD16)
+ (fore-green :initarg :fore-green :type xcb:CARD16)
+ (fore-blue :initarg :fore-blue :type xcb:CARD16)
+ (back-red :initarg :back-red :type xcb:CARD16)
+ (back-green :initarg :back-green :type xcb:CARD16)
+ (back-blue :initarg :back-blue :type xcb:CARD16)))
+
+(defconst xcb:QueryShapeOf:LargestCursor 0)
+(defconst xcb:QueryShapeOf:FastestTile 1)
+(defconst xcb:QueryShapeOf:FastestStipple 2)
+
+(defclass xcb:QueryBestSize
+ (xcb:-request)
+ ((~opcode :initform 97 :type xcb:-u1)
+ (class :initarg :class :type xcb:CARD8)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+(defclass xcb:QueryBestSize~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+
+(defclass xcb:QueryExtension
+ (xcb:-request)
+ ((~opcode :initform 98 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)))
+(defclass xcb:QueryExtension~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (present :initarg :present :type xcb:BOOL)
+ (major-opcode :initarg :major-opcode :type xcb:CARD8)
+ (first-event :initarg :first-event :type xcb:CARD8)
+ (first-error :initarg :first-error :type xcb:CARD8)))
+
+(defclass xcb:ListExtensions
+ (xcb:-request)
+ ((~opcode :initform 99 :type xcb:-u1)))
+(defclass xcb:ListExtensions~reply
+ (xcb:-reply)
+ ((names-len :initarg :names-len :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~0 :initform 24 :type xcb:-pad)
+ (names~ :initform
+ '(name names type xcb:STR size
+ (xcb:-fieldref 'names-len))
+ :type xcb:-list)
+ (names :initarg :names :type xcb:-ignore)))
+
+(defclass xcb:ChangeKeyboardMapping
+ (xcb:-request)
+ ((~opcode :initform 100 :type xcb:-u1)
+ (keycode-count :initarg :keycode-count :type xcb:CARD8)
+ (first-keycode :initarg :first-keycode :type xcb:KEYCODE)
+ (keysyms-per-keycode :initarg :keysyms-per-keycode :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (keysyms~ :initform
+ '(name keysyms type xcb:KEYSYM size
+ (*
+ (xcb:-fieldref 'keycode-count)
+ (xcb:-fieldref 'keysyms-per-keycode)))
+ :type xcb:-list)
+ (keysyms :initarg :keysyms :type xcb:-ignore)))
+
+(defclass xcb:GetKeyboardMapping
+ (xcb:-request)
+ ((~opcode :initform 101 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (first-keycode :initarg :first-keycode :type xcb:KEYCODE)
+ (count :initarg :count :type xcb:CARD8)))
+(defclass xcb:GetKeyboardMapping~reply
+ (xcb:-reply)
+ ((keysyms-per-keycode :initarg :keysyms-per-keycode :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~0 :initform 24 :type xcb:-pad)
+ (keysyms~ :initform
+ '(name keysyms type xcb:KEYSYM size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (keysyms :initarg :keysyms :type xcb:-ignore)))
+
+(defconst xcb:KB:KeyClickPercent 1)
+(defconst xcb:KB:BellPercent 2)
+(defconst xcb:KB:BellPitch 4)
+(defconst xcb:KB:BellDuration 8)
+(defconst xcb:KB:Led 16)
+(defconst xcb:KB:LedMode 32)
+(defconst xcb:KB:Key 64)
+(defconst xcb:KB:AutoRepeatMode 128)
+
+(defconst xcb:LedMode:Off 0)
+(defconst xcb:LedMode:On 1)
+
+(defconst xcb:AutoRepeatMode:Off 0)
+(defconst xcb:AutoRepeatMode:On 1)
+(defconst xcb:AutoRepeatMode:Default 2)
+
+(defclass xcb:ChangeKeyboardControl
+ (xcb:-request)
+ ((~opcode :initform 102 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (value-mask :initarg :value-mask :type xcb:CARD32)
+ (value-list :initform
+ '(expression
+ (xcb:-fieldref 'value-mask)
+ cases
+ ((1 key-click-percent)
+ (2 bell-percent)
+ (4 bell-pitch)
+ (8 bell-duration)
+ (16 led)
+ (32 led-mode)
+ (64 key)
+ (128 auto-repeat-mode)))
+ :type xcb:-switch)
+ (key-click-percent :initarg :key-click-percent :type xcb:INT32)
+ (bell-percent :initarg :bell-percent :type xcb:INT32)
+ (bell-pitch :initarg :bell-pitch :type xcb:INT32)
+ (bell-duration :initarg :bell-duration :type xcb:INT32)
+ (led :initarg :led :type xcb:CARD32)
+ (led-mode :initarg :led-mode :type xcb:CARD32)
+ (key :initarg :key :type xcb:KEYCODE32)
+ (auto-repeat-mode :initarg :auto-repeat-mode :type xcb:CARD32)))
+
+(defclass xcb:GetKeyboardControl
+ (xcb:-request)
+ ((~opcode :initform 103 :type xcb:-u1)))
+(defclass xcb:GetKeyboardControl~reply
+ (xcb:-reply)
+ ((global-auto-repeat :initarg :global-auto-repeat :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (led-mask :initarg :led-mask :type xcb:CARD32)
+ (key-click-percent :initarg :key-click-percent :type xcb:CARD8)
+ (bell-percent :initarg :bell-percent :type xcb:CARD8)
+ (bell-pitch :initarg :bell-pitch :type xcb:CARD16)
+ (bell-duration :initarg :bell-duration :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (auto-repeats~ :initform
+ '(name auto-repeats type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (auto-repeats :initarg :auto-repeats :type xcb:-ignore)))
+
+(defclass xcb:Bell
+ (xcb:-request)
+ ((~opcode :initform 104 :type xcb:-u1)
+ (percent :initarg :percent :type xcb:INT8)))
+
+(defclass xcb:ChangePointerControl
+ (xcb:-request)
+ ((~opcode :initform 105 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (acceleration-numerator :initarg :acceleration-numerator :type xcb:INT16)
+ (acceleration-denominator :initarg :acceleration-denominator :type xcb:INT16)
+ (threshold :initarg :threshold :type xcb:INT16)
+ (do-acceleration :initarg :do-acceleration :type xcb:BOOL)
+ (do-threshold :initarg :do-threshold :type xcb:BOOL)))
+
+(defclass xcb:GetPointerControl
+ (xcb:-request)
+ ((~opcode :initform 106 :type xcb:-u1)))
+(defclass xcb:GetPointerControl~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (acceleration-numerator :initarg :acceleration-numerator :type xcb:CARD16)
+ (acceleration-denominator :initarg :acceleration-denominator :type xcb:CARD16)
+ (threshold :initarg :threshold :type xcb:CARD16)
+ (pad~1 :initform 18 :type xcb:-pad)))
+
+(defconst xcb:Blanking:NotPreferred 0)
+(defconst xcb:Blanking:Preferred 1)
+(defconst xcb:Blanking:Default 2)
+
+(defconst xcb:Exposures:NotAllowed 0)
+(defconst xcb:Exposures:Allowed 1)
+(defconst xcb:Exposures:Default 2)
+
+(defclass xcb:SetScreenSaver
+ (xcb:-request)
+ ((~opcode :initform 107 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (timeout :initarg :timeout :type xcb:INT16)
+ (interval :initarg :interval :type xcb:INT16)
+ (prefer-blanking :initarg :prefer-blanking :type xcb:CARD8)
+ (allow-exposures :initarg :allow-exposures :type xcb:CARD8)))
+
+(defclass xcb:GetScreenSaver
+ (xcb:-request)
+ ((~opcode :initform 108 :type xcb:-u1)))
+(defclass xcb:GetScreenSaver~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (timeout :initarg :timeout :type xcb:CARD16)
+ (interval :initarg :interval :type xcb:CARD16)
+ (prefer-blanking :initarg :prefer-blanking :type xcb:BYTE)
+ (allow-exposures :initarg :allow-exposures :type xcb:BYTE)
+ (pad~1 :initform 18 :type xcb:-pad)))
+
+(defconst xcb:HostMode:Insert 0)
+(defconst xcb:HostMode:Delete 1)
+
+(defconst xcb:Family:Internet 0)
+(defconst xcb:Family:DECnet 1)
+(defconst xcb:Family:Chaos 2)
+(defconst xcb:Family:ServerInterpreted 5)
+(defconst xcb:Family:Internet6 6)
+
+(defclass xcb:ChangeHosts
+ (xcb:-request)
+ ((~opcode :initform 109 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:CARD8)
+ (family :initarg :family :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (address-len :initarg :address-len :type xcb:CARD16)
+ (address~ :initform
+ '(name address type xcb:BYTE size
+ (xcb:-fieldref 'address-len))
+ :type xcb:-list)
+ (address :initarg :address :type xcb:-ignore)))
+
+(defclass xcb:HOST
+ (xcb:-struct)
+ ((family :initarg :family :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (address-len :initarg :address-len :type xcb:CARD16)
+ (address~ :initform
+ '(name address type xcb:BYTE size
+ (xcb:-fieldref 'address-len))
+ :type xcb:-list)
+ (address :initarg :address :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:ListHosts
+ (xcb:-request)
+ ((~opcode :initform 110 :type xcb:-u1)))
+(defclass xcb:ListHosts~reply
+ (xcb:-reply)
+ ((mode :initarg :mode :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (hosts-len :initarg :hosts-len :type xcb:CARD16)
+ (pad~0 :initform 22 :type xcb:-pad)
+ (hosts~ :initform
+ '(name hosts type xcb:HOST size
+ (xcb:-fieldref 'hosts-len))
+ :type xcb:-list)
+ (hosts :initarg :hosts :type xcb:-ignore)))
+
+(defconst xcb:AccessControl:Disable 0)
+(defconst xcb:AccessControl:Enable 1)
+
+(defclass xcb:SetAccessControl
+ (xcb:-request)
+ ((~opcode :initform 111 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:CARD8)))
+
+(defconst xcb:CloseDown:DestroyAll 0)
+(defconst xcb:CloseDown:RetainPermanent 1)
+(defconst xcb:CloseDown:RetainTemporary 2)
+
+(defclass xcb:SetCloseDownMode
+ (xcb:-request)
+ ((~opcode :initform 112 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:CARD8)))
+
+(defconst xcb:Kill:AllTemporary 0)
+
+(defclass xcb:KillClient
+ (xcb:-request)
+ ((~opcode :initform 113 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (resource :initarg :resource :type xcb:CARD32)))
+
+(defclass xcb:RotateProperties
+ (xcb:-request)
+ ((~opcode :initform 114 :type xcb:-u1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (window :initarg :window :type xcb:WINDOW)
+ (atoms-len :initarg :atoms-len :type xcb:CARD16)
+ (delta :initarg :delta :type xcb:INT16)
+ (atoms~ :initform
+ '(name atoms type xcb:ATOM size
+ (xcb:-fieldref 'atoms-len))
+ :type xcb:-list)
+ (atoms :initarg :atoms :type xcb:-ignore)))
+
+(defconst xcb:ScreenSaver:Reset 0)
+(defconst xcb:ScreenSaver:Active 1)
+
+(defclass xcb:ForceScreenSaver
+ (xcb:-request)
+ ((~opcode :initform 115 :type xcb:-u1)
+ (mode :initarg :mode :type xcb:CARD8)))
+
+(defconst xcb:MappingStatus:Success 0)
+(defconst xcb:MappingStatus:Busy 1)
+(defconst xcb:MappingStatus:Failure 2)
+
+(defclass xcb:SetPointerMapping
+ (xcb:-request)
+ ((~opcode :initform 116 :type xcb:-u1)
+ (map-len :initarg :map-len :type xcb:CARD8)
+ (map~ :initform
+ '(name map type xcb:CARD8 size
+ (xcb:-fieldref 'map-len))
+ :type xcb:-list)
+ (map :initarg :map :type xcb:-ignore)))
+(defclass xcb:SetPointerMapping~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:GetPointerMapping
+ (xcb:-request)
+ ((~opcode :initform 117 :type xcb:-u1)))
+(defclass xcb:GetPointerMapping~reply
+ (xcb:-reply)
+ ((map-len :initarg :map-len :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~0 :initform 24 :type xcb:-pad)
+ (map~ :initform
+ '(name map type xcb:CARD8 size
+ (xcb:-fieldref 'map-len))
+ :type xcb:-list)
+ (map :initarg :map :type xcb:-ignore)))
+
+(defconst xcb:MapIndex:Shift 0)
+(defconst xcb:MapIndex:Lock 1)
+(defconst xcb:MapIndex:Control 2)
+(defconst xcb:MapIndex:1 3)
+(defconst xcb:MapIndex:2 4)
+(defconst xcb:MapIndex:3 5)
+(defconst xcb:MapIndex:4 6)
+(defconst xcb:MapIndex:5 7)
+
+(defclass xcb:SetModifierMapping
+ (xcb:-request)
+ ((~opcode :initform 118 :type xcb:-u1)
+ (keycodes-per-modifier :initarg :keycodes-per-modifier :type xcb:CARD8)
+ (keycodes~ :initform
+ '(name keycodes type xcb:KEYCODE size
+ (*
+ (xcb:-fieldref 'keycodes-per-modifier)
+ 8))
+ :type xcb:-list)
+ (keycodes :initarg :keycodes :type xcb:-ignore)))
+(defclass xcb:SetModifierMapping~reply
+ (xcb:-reply)
+ ((status :initarg :status :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:GetModifierMapping
+ (xcb:-request)
+ ((~opcode :initform 119 :type xcb:-u1)))
+(defclass xcb:GetModifierMapping~reply
+ (xcb:-reply)
+ ((keycodes-per-modifier :initarg :keycodes-per-modifier :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~0 :initform 24 :type xcb:-pad)
+ (keycodes~ :initform
+ '(name keycodes type xcb:KEYCODE size
+ (*
+ (xcb:-fieldref 'keycodes-per-modifier)
+ 8))
+ :type xcb:-list)
+ (keycodes :initarg :keycodes :type xcb:-ignore)))
+
+(defclass xcb:NoOperation
+ (xcb:-request)
+ ((~opcode :initform 127 :type xcb:-u1)))
+
+(defconst xcb:error-number-class-alist
+ '((1 . xcb:Request)
+ (2 . xcb:Value)
+ (3 . xcb:Window)
+ (4 . xcb:Pixmap)
+ (5 . xcb:Atom)
+ (6 . xcb:Cursor)
+ (7 . xcb:Font)
+ (8 . xcb:Match)
+ (9 . xcb:Drawable)
+ (10 . xcb:Access)
+ (11 . xcb:Alloc)
+ (12 . xcb:Colormap)
+ (13 . xcb:GContext)
+ (14 . xcb:IDChoice)
+ (15 . xcb:Name)
+ (16 . xcb:Length)
+ (17 . xcb:Implementation))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:event-number-class-alist
+ '((2 . xcb:KeyPress)
+ (3 . xcb:KeyRelease)
+ (4 . xcb:ButtonPress)
+ (5 . xcb:ButtonRelease)
+ (6 . xcb:MotionNotify)
+ (7 . xcb:EnterNotify)
+ (8 . xcb:LeaveNotify)
+ (9 . xcb:FocusIn)
+ (10 . xcb:FocusOut)
+ (11 . xcb:KeymapNotify)
+ (12 . xcb:Expose)
+ (13 . xcb:GraphicsExposure)
+ (14 . xcb:NoExposure)
+ (15 . xcb:VisibilityNotify)
+ (16 . xcb:CreateNotify)
+ (17 . xcb:DestroyNotify)
+ (18 . xcb:UnmapNotify)
+ (19 . xcb:MapNotify)
+ (20 . xcb:MapRequest)
+ (21 . xcb:ReparentNotify)
+ (22 . xcb:ConfigureNotify)
+ (23 . xcb:ConfigureRequest)
+ (24 . xcb:GravityNotify)
+ (25 . xcb:ResizeRequest)
+ (26 . xcb:CirculateNotify)
+ (27 . xcb:CirculateRequest)
+ (28 . xcb:PropertyNotify)
+ (29 . xcb:SelectionClear)
+ (30 . xcb:SelectionRequest)
+ (31 . xcb:SelectionNotify)
+ (32 . xcb:ColormapNotify)
+ (33 . xcb:ClientMessage)
+ (34 . xcb:MappingNotify)
+ (35 . xcb:GeGeneric))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-xproto)
+
+;;; xcb-xproto.el ends here
diff --git a/elpa/xelb-0.20/xcb-xproto.elc b/elpa/xelb-0.20/xcb-xproto.elc
new file mode 100644
index 0000000..d4279d2
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xproto.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xselinux.el b/elpa/xelb-0.20/xcb-xselinux.el
new file mode 100644
index 0000000..cc7c47c
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xselinux.el
@@ -0,0 +1,392 @@
+;;; xcb-xselinux.el --- X11 SELinux extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xselinux.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xselinux:-extension-xname "SELinux")
+(defconst xcb:xselinux:-extension-name "SELinux")
+(defconst xcb:xselinux:-major-version 1)
+(defconst xcb:xselinux:-minor-version 0)
+
+(require 'xcb-xproto)
+
+(defclass xcb:xselinux:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (client-major :initarg :client-major :type xcb:CARD8)
+ (client-minor :initarg :client-minor :type xcb:CARD8)))
+(defclass xcb:xselinux:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (server-major :initarg :server-major :type xcb:CARD16)
+ (server-minor :initarg :server-minor :type xcb:CARD16)))
+
+(defclass xcb:xselinux:SetDeviceCreateContext
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetDeviceCreateContext
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)))
+(defclass xcb:xselinux:GetDeviceCreateContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:SetDeviceContext
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (device :initarg :device :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetDeviceContext
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (device :initarg :device :type xcb:CARD32)))
+(defclass xcb:xselinux:GetDeviceContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:SetWindowCreateContext
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetWindowCreateContext
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)))
+(defclass xcb:xselinux:GetWindowCreateContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetWindowContext
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xselinux:GetWindowContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:ListItem
+ (xcb:-struct)
+ ((name :initarg :name :type xcb:ATOM)
+ (object-context-len :initarg :object-context-len :type xcb:CARD32)
+ (data-context-len :initarg :data-context-len :type xcb:CARD32)
+ (object-context~ :initform
+ '(name object-context type xcb:char size
+ (xcb:-fieldref 'object-context-len))
+ :type xcb:-list)
+ (object-context :initarg :object-context :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)
+ (data-context~ :initform
+ '(name data-context type xcb:char size
+ (xcb:-fieldref 'data-context-len))
+ :type xcb:-list)
+ (data-context :initarg :data-context :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:xselinux:SetPropertyCreateContext
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetPropertyCreateContext
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)))
+(defclass xcb:xselinux:GetPropertyCreateContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:SetPropertyUseContext
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetPropertyUseContext
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)))
+(defclass xcb:xselinux:GetPropertyUseContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetPropertyContext
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (property :initarg :property :type xcb:ATOM)))
+(defclass xcb:xselinux:GetPropertyContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetPropertyDataContext
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (property :initarg :property :type xcb:ATOM)))
+(defclass xcb:xselinux:GetPropertyDataContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:ListProperties
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xselinux:ListProperties~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (properties-len :initarg :properties-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (properties~ :initform
+ '(name properties type xcb:xselinux:ListItem size
+ (xcb:-fieldref 'properties-len))
+ :type xcb:-list)
+ (properties :initarg :properties :type xcb:-ignore)))
+
+(defclass xcb:xselinux:SetSelectionCreateContext
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetSelectionCreateContext
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)))
+(defclass xcb:xselinux:GetSelectionCreateContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:SetSelectionUseContext
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetSelectionUseContext
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)))
+(defclass xcb:xselinux:GetSelectionUseContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetSelectionContext
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (selection :initarg :selection :type xcb:ATOM)))
+(defclass xcb:xselinux:GetSelectionContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetSelectionDataContext
+ (xcb:-request)
+ ((~opcode :initform 20 :type xcb:-u1)
+ (selection :initarg :selection :type xcb:ATOM)))
+(defclass xcb:xselinux:GetSelectionDataContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+(defclass xcb:xselinux:ListSelections
+ (xcb:-request)
+ ((~opcode :initform 21 :type xcb:-u1)))
+(defclass xcb:xselinux:ListSelections~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (selections-len :initarg :selections-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (selections~ :initform
+ '(name selections type xcb:xselinux:ListItem size
+ (xcb:-fieldref 'selections-len))
+ :type xcb:-list)
+ (selections :initarg :selections :type xcb:-ignore)))
+
+(defclass xcb:xselinux:GetClientContext
+ (xcb:-request)
+ ((~opcode :initform 22 :type xcb:-u1)
+ (resource :initarg :resource :type xcb:CARD32)))
+(defclass xcb:xselinux:GetClientContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (context-len :initarg :context-len :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (context~ :initform
+ '(name context type xcb:char size
+ (xcb:-fieldref 'context-len))
+ :type xcb:-list)
+ (context :initarg :context :type xcb:-ignore)))
+
+
+
+(provide 'xcb-xselinux)
+
+;;; xcb-xselinux.el ends here
diff --git a/elpa/xelb-0.20/xcb-xselinux.elc b/elpa/xelb-0.20/xcb-xselinux.elc
new file mode 100644
index 0000000..fa735ab
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xselinux.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xsettings.el b/elpa/xelb-0.20/xcb-xsettings.el
new file mode 100644
index 0000000..1d7c0e3
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xsettings.el
@@ -0,0 +1,88 @@
+;;; xcb-xsettings.el --- XSETTINGS protocol -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 Free Software Foundation, Inc.
+
+;; 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 file is written by hand. If possible we should auto-generate it
+;; from an XML protocol specification. The XSETTINGS protocol is
+;; specified at: https://specifications.freedesktop.org/xsettings-spec/
+
+;;; Code:
+
+(require 'xcb-types)
+(require 'xcb-icccm)
+
+(defconst xcb:xsettings:-Type:Integer 0)
+(defconst xcb:xsettings:-Type:String 1)
+(defconst xcb:xsettings:-Type:Color 2)
+
+(defclass xcb:xsettings:-Settings
+ (xcb:-struct)
+ ((byte-order :initarg :byte-order :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)
+ (serial :initarg :serial :type xcb:CARD32)
+ (settings-len :initarg :settings-len :type xcb:CARD32)
+ (settings~ :initform
+ '(name settings type xcb:xsettings:-SETTING size
+ (xcb:-fieldref 'settings-len))
+ :type xcb:-list)
+ (settings :initarg :settings :type xcb:-ignore)))
+
+(defclass xcb:xsettings:-SETTING
+ (xcb:-struct)
+ ((type :initarg :type :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (name-len :initarg :name-len :type xcb:CARD16)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-len))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (last-change-serial :initarg :last-change-serial :type xcb:CARD32)))
+
+(defclass xcb:xsettings:-SETTING_INTEGER
+ (xcb:xsettings:-SETTING)
+ ((type :initform 'xcb:xsettings:-Type:Integer)
+ (value :initarg :value :type xcb:INT32)))
+
+(defclass xcb:xsettings:-SETTING_STRING
+ (xcb:xsettings:-SETTING)
+ ((type :initform 'xcb:xsettings:-Type:String)
+ (value-len :initarg :value-len :type xcb:CARD32)
+ (value~ :initform
+ '(name value type xcb:char size
+ (xcb:-fieldref 'value-len))
+ :type xcb:-list)
+ (value :initarg :value :type xcb:-ignore)
+ (pad~2 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:xsettings:-SETTING_COLOR
+ (xcb:xsettings:-SETTING)
+ ((type :initform 'xcb:xsettings:-Type:Color)
+ (red :initarg :red :type xcb:CARD16)
+ (green :initarg :green :type xcb:CARD16)
+ (blue :initarg :blue :type xcb:CARD16)
+ (alpha :initarg :alpha :initform #xffff :type xcb:CARD16)))
+
+
+
+(provide 'xcb-xsettings)
+
+;;; xcb-xsettings.el ends here
diff --git a/elpa/xelb-0.20/xcb-xsettings.elc b/elpa/xelb-0.20/xcb-xsettings.elc
new file mode 100644
index 0000000..edff8a6
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xsettings.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xtest.el b/elpa/xelb-0.20/xcb-xtest.el
new file mode 100644
index 0000000..431cd25
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xtest.el
@@ -0,0 +1,87 @@
+;;; xcb-xtest.el --- X11 Test extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xtest.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xtest:-extension-xname "XTEST")
+(defconst xcb:xtest:-extension-name "Test")
+(defconst xcb:xtest:-major-version 2)
+(defconst xcb:xtest:-minor-version 2)
+
+(require 'xcb-xproto)
+
+(defclass xcb:xtest:GetVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)
+ (major-version :initarg :major-version :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (minor-version :initarg :minor-version :type xcb:CARD16)))
+(defclass xcb:xtest:GetVersion~reply
+ (xcb:-reply)
+ ((major-version :initarg :major-version :type xcb:CARD8)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (minor-version :initarg :minor-version :type xcb:CARD16)))
+
+(defconst xcb:xtest:Cursor:None 0)
+(defconst xcb:xtest:Cursor:Current 1)
+
+(defclass xcb:xtest:CompareCursor
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)
+ (cursor :initarg :cursor :type xcb:CURSOR)))
+(defclass xcb:xtest:CompareCursor~reply
+ (xcb:-reply)
+ ((same :initarg :same :type xcb:BOOL)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:xtest:FakeInput
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (type :initarg :type :type xcb:BYTE)
+ (detail :initarg :detail :type xcb:BYTE)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (time :initarg :time :type xcb:CARD32)
+ (root :initarg :root :type xcb:WINDOW)
+ (pad~1 :initform 8 :type xcb:-pad)
+ (rootX :initarg :rootX :type xcb:INT16)
+ (rootY :initarg :rootY :type xcb:INT16)
+ (pad~2 :initform 7 :type xcb:-pad)
+ (deviceid :initarg :deviceid :type xcb:CARD8)))
+
+(defclass xcb:xtest:GrabControl
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (impervious :initarg :impervious :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+
+
+(provide 'xcb-xtest)
+
+;;; xcb-xtest.el ends here
diff --git a/elpa/xelb-0.20/xcb-xtest.elc b/elpa/xelb-0.20/xcb-xtest.elc
new file mode 100644
index 0000000..9fd764a
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xtest.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xv.el b/elpa/xelb-0.20/xcb-xv.el
new file mode 100644
index 0000000..627461e
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xv.el
@@ -0,0 +1,523 @@
+;;; xcb-xv.el --- X11 Xv extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xv.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xv:-extension-xname "XVideo")
+(defconst xcb:xv:-extension-name "Xv")
+(defconst xcb:xv:-major-version 2)
+(defconst xcb:xv:-minor-version 2)
+
+(require 'xcb-xproto)
+
+(require 'xcb-shm)
+
+(xcb:deftypealias 'xcb:xv:PORT 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:xv:ENCODING 'xcb:-u4)
+
+(defconst xcb:xv:Type:InputMask 1)
+(defconst xcb:xv:Type:OutputMask 2)
+(defconst xcb:xv:Type:VideoMask 4)
+(defconst xcb:xv:Type:StillMask 8)
+(defconst xcb:xv:Type:ImageMask 16)
+
+(defconst xcb:xv:ImageFormatInfoType:RGB 0)
+(defconst xcb:xv:ImageFormatInfoType:YUV 1)
+
+(defconst xcb:xv:ImageFormatInfoFormat:Packed 0)
+(defconst xcb:xv:ImageFormatInfoFormat:Planar 1)
+
+(defconst xcb:xv:AttributeFlag:Gettable 1)
+(defconst xcb:xv:AttributeFlag:Settable 2)
+
+(defconst xcb:xv:VideoNotifyReason:Started 0)
+(defconst xcb:xv:VideoNotifyReason:Stopped 1)
+(defconst xcb:xv:VideoNotifyReason:Busy 2)
+(defconst xcb:xv:VideoNotifyReason:Preempted 3)
+(defconst xcb:xv:VideoNotifyReason:HardError 4)
+
+(defconst xcb:xv:ScanlineOrder:TopToBottom 0)
+(defconst xcb:xv:ScanlineOrder:BottomToTop 1)
+
+(defconst xcb:xv:GrabPortStatus:Success 0)
+(defconst xcb:xv:GrabPortStatus:BadExtension 1)
+(defconst xcb:xv:GrabPortStatus:AlreadyGrabbed 2)
+(defconst xcb:xv:GrabPortStatus:InvalidTime 3)
+(defconst xcb:xv:GrabPortStatus:BadReply 4)
+(defconst xcb:xv:GrabPortStatus:BadAlloc 5)
+
+(defclass xcb:xv:Rational
+ (xcb:-struct)
+ ((numerator :initarg :numerator :type xcb:INT32)
+ (denominator :initarg :denominator :type xcb:INT32)))
+
+(defclass xcb:xv:Format
+ (xcb:-struct)
+ ((visual :initarg :visual :type xcb:VISUALID)
+ (depth :initarg :depth :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xv:AdaptorInfo
+ (xcb:-struct)
+ ((base-id :initarg :base-id :type xcb:xv:PORT)
+ (name-size :initarg :name-size :type xcb:CARD16)
+ (num-ports :initarg :num-ports :type xcb:CARD16)
+ (num-formats :initarg :num-formats :type xcb:CARD16)
+ (type :initarg :type :type xcb:CARD8)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-size))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)
+ (formats~ :initform
+ '(name formats type xcb:xv:Format size
+ (xcb:-fieldref 'num-formats))
+ :type xcb:-list)
+ (formats :initarg :formats :type xcb:-ignore)))
+
+(defclass xcb:xv:EncodingInfo
+ (xcb:-struct)
+ ((encoding :initarg :encoding :type xcb:xv:ENCODING)
+ (name-size :initarg :name-size :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (rate :initarg :rate :type xcb:xv:Rational)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'name-size))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~1 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:xv:Image
+ (xcb:-struct)
+ ((id :initarg :id :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (data-size :initarg :data-size :type xcb:CARD32)
+ (num-planes :initarg :num-planes :type xcb:CARD32)
+ (pitches~ :initform
+ '(name pitches type xcb:CARD32 size
+ (xcb:-fieldref 'num-planes))
+ :type xcb:-list)
+ (pitches :initarg :pitches :type xcb:-ignore)
+ (offsets~ :initform
+ '(name offsets type xcb:CARD32 size
+ (xcb:-fieldref 'num-planes))
+ :type xcb:-list)
+ (offsets :initarg :offsets :type xcb:-ignore)
+ (data~ :initform
+ '(name data type xcb:CARD8 size
+ (xcb:-fieldref 'data-size))
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:xv:AttributeInfo
+ (xcb:-struct)
+ ((flags :initarg :flags :type xcb:CARD32)
+ (min :initarg :min :type xcb:INT32)
+ (max :initarg :max :type xcb:INT32)
+ (size :initarg :size :type xcb:CARD32)
+ (name~ :initform
+ '(name name type xcb:char size
+ (xcb:-fieldref 'size))
+ :type xcb:-list)
+ (name :initarg :name :type xcb:-ignore)
+ (pad~0 :initform 4 :type xcb:-pad-align)))
+
+(defclass xcb:xv:ImageFormatInfo
+ (xcb:-struct)
+ ((id :initarg :id :type xcb:CARD32)
+ (type :initarg :type :type xcb:CARD8)
+ (byte-order :initarg :byte-order :type xcb:CARD8)
+ (pad~0 :initform 2 :type xcb:-pad)
+ (guid~ :initform
+ '(name guid type xcb:CARD8 size 16)
+ :type xcb:-list)
+ (guid :initarg :guid :type xcb:-ignore)
+ (bpp :initarg :bpp :type xcb:CARD8)
+ (num-planes :initarg :num-planes :type xcb:CARD8)
+ (pad~1 :initform 2 :type xcb:-pad)
+ (depth :initarg :depth :type xcb:CARD8)
+ (pad~2 :initform 3 :type xcb:-pad)
+ (red-mask :initarg :red-mask :type xcb:CARD32)
+ (green-mask :initarg :green-mask :type xcb:CARD32)
+ (blue-mask :initarg :blue-mask :type xcb:CARD32)
+ (format :initarg :format :type xcb:CARD8)
+ (pad~3 :initform 3 :type xcb:-pad)
+ (y-sample-bits :initarg :y-sample-bits :type xcb:CARD32)
+ (u-sample-bits :initarg :u-sample-bits :type xcb:CARD32)
+ (v-sample-bits :initarg :v-sample-bits :type xcb:CARD32)
+ (vhorz-y-period :initarg :vhorz-y-period :type xcb:CARD32)
+ (vhorz-u-period :initarg :vhorz-u-period :type xcb:CARD32)
+ (vhorz-v-period :initarg :vhorz-v-period :type xcb:CARD32)
+ (vvert-y-period :initarg :vvert-y-period :type xcb:CARD32)
+ (vvert-u-period :initarg :vvert-u-period :type xcb:CARD32)
+ (vvert-v-period :initarg :vvert-v-period :type xcb:CARD32)
+ (vcomp-order~ :initform
+ '(name vcomp-order type xcb:CARD8 size 32)
+ :type xcb:-list)
+ (vcomp-order :initarg :vcomp-order :type xcb:-ignore)
+ (vscanline-order :initarg :vscanline-order :type xcb:CARD8)
+ (pad~4 :initform 11 :type xcb:-pad)))
+
+(defclass xcb:xv:BadPort
+ (xcb:-error)
+ ((~code :initform 0)))
+
+(defclass xcb:xv:BadEncoding
+ (xcb:-error)
+ ((~code :initform 1)))
+
+(defclass xcb:xv:BadControl
+ (xcb:-error)
+ ((~code :initform 2)))
+
+(defclass xcb:xv:VideoNotify
+ (xcb:-event)
+ ((~code :initform 0)
+ (reason :initarg :reason :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (port :initarg :port :type xcb:xv:PORT)))
+
+(defclass xcb:xv:PortNotify
+ (xcb:-event)
+ ((~code :initform 1)
+ (pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (time :initarg :time :type xcb:TIMESTAMP)
+ (port :initarg :port :type xcb:xv:PORT)
+ (attribute :initarg :attribute :type xcb:ATOM)
+ (value :initarg :value :type xcb:INT32)))
+
+(defclass xcb:xv:QueryExtension
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)))
+(defclass xcb:xv:QueryExtension~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major :initarg :major :type xcb:CARD16)
+ (minor :initarg :minor :type xcb:CARD16)))
+
+(defclass xcb:xv:QueryAdaptors
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (window :initarg :window :type xcb:WINDOW)))
+(defclass xcb:xv:QueryAdaptors~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-adaptors :initarg :num-adaptors :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (info~ :initform
+ '(name info type xcb:xv:AdaptorInfo size
+ (xcb:-fieldref 'num-adaptors))
+ :type xcb:-list)
+ (info :initarg :info :type xcb:-ignore)))
+
+(defclass xcb:xv:QueryEncodings
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)))
+(defclass xcb:xv:QueryEncodings~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-encodings :initarg :num-encodings :type xcb:CARD16)
+ (pad~1 :initform 22 :type xcb:-pad)
+ (info~ :initform
+ '(name info type xcb:xv:EncodingInfo size
+ (xcb:-fieldref 'num-encodings))
+ :type xcb:-list)
+ (info :initarg :info :type xcb:-ignore)))
+
+(defclass xcb:xv:GrabPort
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+(defclass xcb:xv:GrabPort~reply
+ (xcb:-reply)
+ ((result :initarg :result :type xcb:BYTE)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)))
+
+(defclass xcb:xv:UngrabPort
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (time :initarg :time :type xcb:TIMESTAMP)))
+
+(defclass xcb:xv:PutVideo
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (vid-x :initarg :vid-x :type xcb:INT16)
+ (vid-y :initarg :vid-y :type xcb:INT16)
+ (vid-w :initarg :vid-w :type xcb:CARD16)
+ (vid-h :initarg :vid-h :type xcb:CARD16)
+ (drw-x :initarg :drw-x :type xcb:INT16)
+ (drw-y :initarg :drw-y :type xcb:INT16)
+ (drw-w :initarg :drw-w :type xcb:CARD16)
+ (drw-h :initarg :drw-h :type xcb:CARD16)))
+
+(defclass xcb:xv:PutStill
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (vid-x :initarg :vid-x :type xcb:INT16)
+ (vid-y :initarg :vid-y :type xcb:INT16)
+ (vid-w :initarg :vid-w :type xcb:CARD16)
+ (vid-h :initarg :vid-h :type xcb:CARD16)
+ (drw-x :initarg :drw-x :type xcb:INT16)
+ (drw-y :initarg :drw-y :type xcb:INT16)
+ (drw-w :initarg :drw-w :type xcb:CARD16)
+ (drw-h :initarg :drw-h :type xcb:CARD16)))
+
+(defclass xcb:xv:GetVideo
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (vid-x :initarg :vid-x :type xcb:INT16)
+ (vid-y :initarg :vid-y :type xcb:INT16)
+ (vid-w :initarg :vid-w :type xcb:CARD16)
+ (vid-h :initarg :vid-h :type xcb:CARD16)
+ (drw-x :initarg :drw-x :type xcb:INT16)
+ (drw-y :initarg :drw-y :type xcb:INT16)
+ (drw-w :initarg :drw-w :type xcb:CARD16)
+ (drw-h :initarg :drw-h :type xcb:CARD16)))
+
+(defclass xcb:xv:GetStill
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (vid-x :initarg :vid-x :type xcb:INT16)
+ (vid-y :initarg :vid-y :type xcb:INT16)
+ (vid-w :initarg :vid-w :type xcb:CARD16)
+ (vid-h :initarg :vid-h :type xcb:CARD16)
+ (drw-x :initarg :drw-x :type xcb:INT16)
+ (drw-y :initarg :drw-y :type xcb:INT16)
+ (drw-w :initarg :drw-w :type xcb:CARD16)
+ (drw-h :initarg :drw-h :type xcb:CARD16)))
+
+(defclass xcb:xv:StopVideo
+ (xcb:-request)
+ ((~opcode :initform 9 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)))
+
+(defclass xcb:xv:SelectVideoNotify
+ (xcb:-request)
+ ((~opcode :initform 10 :type xcb:-u1)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (onoff :initarg :onoff :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xv:SelectPortNotify
+ (xcb:-request)
+ ((~opcode :initform 11 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (onoff :initarg :onoff :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defclass xcb:xv:QueryBestSize
+ (xcb:-request)
+ ((~opcode :initform 12 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (vid-w :initarg :vid-w :type xcb:CARD16)
+ (vid-h :initarg :vid-h :type xcb:CARD16)
+ (drw-w :initarg :drw-w :type xcb:CARD16)
+ (drw-h :initarg :drw-h :type xcb:CARD16)
+ (motion :initarg :motion :type xcb:BOOL)
+ (pad~0 :initform 3 :type xcb:-pad)))
+(defclass xcb:xv:QueryBestSize~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (actual-width :initarg :actual-width :type xcb:CARD16)
+ (actual-height :initarg :actual-height :type xcb:CARD16)))
+
+(defclass xcb:xv:SetPortAttribute
+ (xcb:-request)
+ ((~opcode :initform 13 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (attribute :initarg :attribute :type xcb:ATOM)
+ (value :initarg :value :type xcb:INT32)))
+
+(defclass xcb:xv:GetPortAttribute
+ (xcb:-request)
+ ((~opcode :initform 14 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (attribute :initarg :attribute :type xcb:ATOM)))
+(defclass xcb:xv:GetPortAttribute~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (value :initarg :value :type xcb:INT32)))
+
+(defclass xcb:xv:QueryPortAttributes
+ (xcb:-request)
+ ((~opcode :initform 15 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)))
+(defclass xcb:xv:QueryPortAttributes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-attributes :initarg :num-attributes :type xcb:CARD32)
+ (text-size :initarg :text-size :type xcb:CARD32)
+ (pad~1 :initform 16 :type xcb:-pad)
+ (attributes~ :initform
+ '(name attributes type xcb:xv:AttributeInfo size
+ (xcb:-fieldref 'num-attributes))
+ :type xcb:-list)
+ (attributes :initarg :attributes :type xcb:-ignore)))
+
+(defclass xcb:xv:ListImageFormats
+ (xcb:-request)
+ ((~opcode :initform 16 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)))
+(defclass xcb:xv:ListImageFormats~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-formats :initarg :num-formats :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (format~ :initform
+ '(name format type xcb:xv:ImageFormatInfo size
+ (xcb:-fieldref 'num-formats))
+ :type xcb:-list)
+ (format :initarg :format :type xcb:-ignore)))
+
+(defclass xcb:xv:QueryImageAttributes
+ (xcb:-request)
+ ((~opcode :initform 17 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (id :initarg :id :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+(defclass xcb:xv:QueryImageAttributes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num-planes :initarg :num-planes :type xcb:CARD32)
+ (data-size :initarg :data-size :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (pitches~ :initform
+ '(name pitches type xcb:CARD32 size
+ (xcb:-fieldref 'num-planes))
+ :type xcb:-list)
+ (pitches :initarg :pitches :type xcb:-ignore)
+ (offsets~ :initform
+ '(name offsets type xcb:CARD32 size
+ (xcb:-fieldref 'num-planes))
+ :type xcb:-list)
+ (offsets :initarg :offsets :type xcb:-ignore)))
+
+(defclass xcb:xv:PutImage
+ (xcb:-request)
+ ((~opcode :initform 18 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (id :initarg :id :type xcb:CARD32)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (src-w :initarg :src-w :type xcb:CARD16)
+ (src-h :initarg :src-h :type xcb:CARD16)
+ (drw-x :initarg :drw-x :type xcb:INT16)
+ (drw-y :initarg :drw-y :type xcb:INT16)
+ (drw-w :initarg :drw-w :type xcb:CARD16)
+ (drw-h :initarg :drw-h :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (data~ :initform
+ '(name data type xcb:CARD8 size nil)
+ :type xcb:-list)
+ (data :initarg :data :type xcb:-ignore)))
+
+(defclass xcb:xv:ShmPutImage
+ (xcb:-request)
+ ((~opcode :initform 19 :type xcb:-u1)
+ (port :initarg :port :type xcb:xv:PORT)
+ (drawable :initarg :drawable :type xcb:DRAWABLE)
+ (gc :initarg :gc :type xcb:GCONTEXT)
+ (shmseg :initarg :shmseg :type xcb:shm:SEG)
+ (id :initarg :id :type xcb:CARD32)
+ (offset :initarg :offset :type xcb:CARD32)
+ (src-x :initarg :src-x :type xcb:INT16)
+ (src-y :initarg :src-y :type xcb:INT16)
+ (src-w :initarg :src-w :type xcb:CARD16)
+ (src-h :initarg :src-h :type xcb:CARD16)
+ (drw-x :initarg :drw-x :type xcb:INT16)
+ (drw-y :initarg :drw-y :type xcb:INT16)
+ (drw-w :initarg :drw-w :type xcb:CARD16)
+ (drw-h :initarg :drw-h :type xcb:CARD16)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (send-event :initarg :send-event :type xcb:CARD8)
+ (pad~0 :initform 3 :type xcb:-pad)))
+
+(defconst xcb:xv:error-number-class-alist
+ '((0 . xcb:xv:BadPort)
+ (1 . xcb:xv:BadEncoding)
+ (2 . xcb:xv:BadControl))
+ "(error-number . error-class) alist.")
+
+(defconst xcb:xv:event-number-class-alist
+ '((0 . xcb:xv:VideoNotify)
+ (1 . xcb:xv:PortNotify))
+ "(event-number . event-class) alist.")
+
+
+
+(provide 'xcb-xv)
+
+;;; xcb-xv.el ends here
diff --git a/elpa/xelb-0.20/xcb-xv.elc b/elpa/xelb-0.20/xcb-xv.elc
new file mode 100644
index 0000000..37847a7
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xv.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb-xvmc.el b/elpa/xelb-0.20/xcb-xvmc.el
new file mode 100644
index 0000000..1e9fa2d
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xvmc.el
@@ -0,0 +1,188 @@
+;;; xcb-xvmc.el --- X11 XvMC extension -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from 'xvmc.xml',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+(require 'xcb-types)
+
+(defconst xcb:xvmc:-extension-xname "XVideo-MotionCompensation")
+(defconst xcb:xvmc:-extension-name "XvMC")
+(defconst xcb:xvmc:-major-version 1)
+(defconst xcb:xvmc:-minor-version 1)
+
+(require 'xcb-xv)
+
+(xcb:deftypealias 'xcb:xvmc:CONTEXT 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:xvmc:SURFACE 'xcb:-u4)
+
+(xcb:deftypealias 'xcb:xvmc:SUBPICTURE 'xcb:-u4)
+
+(defclass xcb:xvmc:SurfaceInfo
+ (xcb:-struct)
+ ((id :initarg :id :type xcb:xvmc:SURFACE)
+ (chroma-format :initarg :chroma-format :type xcb:CARD16)
+ (pad0 :initarg :pad0 :type xcb:CARD16)
+ (max-width :initarg :max-width :type xcb:CARD16)
+ (max-height :initarg :max-height :type xcb:CARD16)
+ (subpicture-max-width :initarg :subpicture-max-width :type xcb:CARD16)
+ (subpicture-max-height :initarg :subpicture-max-height :type xcb:CARD16)
+ (mc-type :initarg :mc-type :type xcb:CARD32)
+ (flags :initarg :flags :type xcb:CARD32)))
+
+(defclass xcb:xvmc:QueryVersion
+ (xcb:-request)
+ ((~opcode :initform 0 :type xcb:-u1)))
+(defclass xcb:xvmc:QueryVersion~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (major :initarg :major :type xcb:CARD32)
+ (minor :initarg :minor :type xcb:CARD32)))
+
+(defclass xcb:xvmc:ListSurfaceTypes
+ (xcb:-request)
+ ((~opcode :initform 1 :type xcb:-u1)
+ (port-id :initarg :port-id :type xcb:xv:PORT)))
+(defclass xcb:xvmc:ListSurfaceTypes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num :initarg :num :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (surfaces~ :initform
+ '(name surfaces type xcb:xvmc:SurfaceInfo size
+ (xcb:-fieldref 'num))
+ :type xcb:-list)
+ (surfaces :initarg :surfaces :type xcb:-ignore)))
+
+(defclass xcb:xvmc:CreateContext
+ (xcb:-request)
+ ((~opcode :initform 2 :type xcb:-u1)
+ (context-id :initarg :context-id :type xcb:xvmc:CONTEXT)
+ (port-id :initarg :port-id :type xcb:xv:PORT)
+ (surface-id :initarg :surface-id :type xcb:xvmc:SURFACE)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)
+ (flags :initarg :flags :type xcb:CARD32)))
+(defclass xcb:xvmc:CreateContext~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (width-actual :initarg :width-actual :type xcb:CARD16)
+ (height-actual :initarg :height-actual :type xcb:CARD16)
+ (flags-return :initarg :flags-return :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (priv-data~ :initform
+ '(name priv-data type xcb:CARD32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (priv-data :initarg :priv-data :type xcb:-ignore)))
+
+(defclass xcb:xvmc:DestroyContext
+ (xcb:-request)
+ ((~opcode :initform 3 :type xcb:-u1)
+ (context-id :initarg :context-id :type xcb:xvmc:CONTEXT)))
+
+(defclass xcb:xvmc:CreateSurface
+ (xcb:-request)
+ ((~opcode :initform 4 :type xcb:-u1)
+ (surface-id :initarg :surface-id :type xcb:xvmc:SURFACE)
+ (context-id :initarg :context-id :type xcb:xvmc:CONTEXT)))
+(defclass xcb:xvmc:CreateSurface~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (pad~1 :initform 24 :type xcb:-pad)
+ (priv-data~ :initform
+ '(name priv-data type xcb:CARD32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (priv-data :initarg :priv-data :type xcb:-ignore)))
+
+(defclass xcb:xvmc:DestroySurface
+ (xcb:-request)
+ ((~opcode :initform 5 :type xcb:-u1)
+ (surface-id :initarg :surface-id :type xcb:xvmc:SURFACE)))
+
+(defclass xcb:xvmc:CreateSubpicture
+ (xcb:-request)
+ ((~opcode :initform 6 :type xcb:-u1)
+ (subpicture-id :initarg :subpicture-id :type xcb:xvmc:SUBPICTURE)
+ (context :initarg :context :type xcb:xvmc:CONTEXT)
+ (xvimage-id :initarg :xvimage-id :type xcb:CARD32)
+ (width :initarg :width :type xcb:CARD16)
+ (height :initarg :height :type xcb:CARD16)))
+(defclass xcb:xvmc:CreateSubpicture~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (width-actual :initarg :width-actual :type xcb:CARD16)
+ (height-actual :initarg :height-actual :type xcb:CARD16)
+ (num-palette-entries :initarg :num-palette-entries :type xcb:CARD16)
+ (entry-bytes :initarg :entry-bytes :type xcb:CARD16)
+ (component-order~ :initform
+ '(name component-order type xcb:CARD8 size 4)
+ :type xcb:-list)
+ (component-order :initarg :component-order :type xcb:-ignore)
+ (pad~1 :initform 12 :type xcb:-pad)
+ (priv-data~ :initform
+ '(name priv-data type xcb:CARD32 size
+ (xcb:-fieldref 'length))
+ :type xcb:-list)
+ (priv-data :initarg :priv-data :type xcb:-ignore)))
+
+(defclass xcb:xvmc:DestroySubpicture
+ (xcb:-request)
+ ((~opcode :initform 7 :type xcb:-u1)
+ (subpicture-id :initarg :subpicture-id :type xcb:xvmc:SUBPICTURE)))
+
+(defclass xcb:xvmc:ListSubpictureTypes
+ (xcb:-request)
+ ((~opcode :initform 8 :type xcb:-u1)
+ (port-id :initarg :port-id :type xcb:xv:PORT)
+ (surface-id :initarg :surface-id :type xcb:xvmc:SURFACE)))
+(defclass xcb:xvmc:ListSubpictureTypes~reply
+ (xcb:-reply)
+ ((pad~0 :initform 1 :type xcb:-pad)
+ (~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32)
+ (num :initarg :num :type xcb:CARD32)
+ (pad~1 :initform 20 :type xcb:-pad)
+ (types~ :initform
+ '(name types type xcb:xv:ImageFormatInfo size
+ (xcb:-fieldref 'num))
+ :type xcb:-list)
+ (types :initarg :types :type xcb:-ignore)))
+
+
+
+(provide 'xcb-xvmc)
+
+;;; xcb-xvmc.el ends here
diff --git a/elpa/xelb-0.20/xcb-xvmc.elc b/elpa/xelb-0.20/xcb-xvmc.elc
new file mode 100644
index 0000000..49b79a7
--- /dev/null
+++ b/elpa/xelb-0.20/xcb-xvmc.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xcb.el b/elpa/xelb-0.20/xcb.el
new file mode 100644
index 0000000..afe36ee
--- /dev/null
+++ b/elpa/xelb-0.20/xcb.el
@@ -0,0 +1,883 @@
+;;; xcb.el --- X protocol Emacs Lisp Binding (XELB) -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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 library mainly provides methods for `xcb:connection', a opaque class
+;; encapsulating all information concerning an X connection. The most
+;; frequently used methods are:
+;; + Open/Close connection
+;; - `xcb:connect'
+;; - `xcb:disconnect'
+;; + Request/Reply/Error (asynchronous)
+;; - `xcb:+request'
+;; - `xcb:+request-checked'
+;; - `xcb:+request-unchecked'
+;; - `xcb:+reply'
+;; - `xcb:request-check'
+;; + Request/Reply/Error (synchronous)
+;; - `xcb:+request+reply'
+;; - `xcb:+request-checked+request-check'
+;; - `xcb:+request-unchecked+reply'
+;; + Event handling
+;; - `xcb:+event'
+;; + Misc.
+;; - `xcb:flush'
+;; - `xcb:generate-id'
+;; Please refer to their documentations for more details.
+
+;; Todo:
+;; + Use XC-MISC extension for `xcb:generate-id' when IDs are used up.
+
+;; References:
+;; + X protocol (http://www.x.org/releases/X11R7.7/doc/xproto/x11protocol.txt)
+
+;;; Code:
+
+(require 'cl-lib)
+
+(require 'xcb-xproto)
+
+(defvar xcb:connection-timeout 3 "Connection timeout.")
+
+;;;; X connection related
+
+(defclass xcb:connection (xcb:--struct)
+ ((process :initarg :process :initform nil)
+ (connected :initform nil) ;non-nil indicates connected to X server
+ (display :initarg :display :initform nil)
+ (auth-info :initarg :auth-info :initform nil)
+ (socket :initarg :socket :initform nil)
+ (lock :initform nil)
+ (setup-data :initform nil) ;X connection setup data
+ (request-cache :initform []) ;cache for outgoing requests
+ (message-cache :initform []) ;cache for incoming messages
+ (event-lock :initform 0)
+ (event-queue :initform nil)
+ (error-plist :initform nil)
+ (reply-plist :initform nil)
+ (event-plist :initform nil)
+ (extension-plist :initform nil)
+ (extension-opcode-plist :initform nil)
+ (extension-first-error-alist :initform nil)
+ (extension-first-event-alist :initform nil)
+ (request-sequence :initform 0)
+ (last-seen-sequence :initform 0)
+ (xid :initform 0) ;last used X resource ID
+ (extra-plist :initform nil)) ;for storing extra data (e.g. by extensions)
+ :documentation "X connection.")
+
+(defclass xcb:auth-info (xcb:--struct)
+ ((name :initarg :name :initform "" :type string)
+ (data :initarg :data :initform "" :type string))
+ :documentation "X connection authentication info.")
+
+(cl-defmethod xcb:-get-extra-plist ((conn xcb:connection) module prop)
+ "Get the value of PROP from the extra plist for module MODULE."
+ (plist-get (plist-get (slot-value conn 'extra-plist) module) prop))
+
+(cl-defmethod xcb:-set-extra-plist ((conn xcb:connection) module prop val)
+ "Set the value of PROP in the extra plist for module MODULE to VAL."
+ (with-slots (extra-plist) conn
+ (setf extra-plist
+ (plist-put extra-plist module
+ (plist-put (plist-get extra-plist module) prop val)))))
+
+(defun xcb:connect (&optional display _screen)
+ "Connect to X server with display DISPLAY."
+ (declare (advertised-calling-convention (&optional display) "25.1"))
+ (unless display (setq display (frame-parameter nil 'display)))
+ (unless display (error "[XELB] No X display available"))
+ (let ((socket (xcb:display->socket display)))
+ (if (file-exists-p socket)
+ (xcb:connect-to-socket socket)
+ (xcb:connect-to-display-with-auth-info display))))
+
+(defun xcb:display->socket (display)
+ "Convert X11 display DISPLAY to its corresponding socket."
+ (concat "/tmp/.X11-unix/X"
+ (replace-regexp-in-string ".*:\\([^\\.]+\\).*" "\\1" display)))
+
+(defun xcb:connect-to-display-with-auth-info (&optional display auth _screen)
+ "Connect to X server with display DISPLAY, auth info AUTH."
+ (declare (advertised-calling-convention (&optional display auth) "25.1"))
+ (unless display (setq display (frame-parameter nil 'display)))
+ (unless display (error "[XELB] No X display available"))
+ (let* ((tmp (xcb:parse-display display))
+ (host (cdr (assoc 'host tmp)))
+ (host (if (string= "" host) 'local host))
+ (dpy (cdr (assoc 'display tmp)))
+ (process (make-network-process :name "XELB"
+ :host host
+ :service (+ 6000 dpy)))
+ (auth-info (if auth auth (xcb:create-auth-info)))
+ (connection (make-instance 'xcb:connection
+ :process process
+ :display display :auth-info auth-info)))
+ (xcb:-connect connection)
+ connection))
+
+(defun xcb:parse-display (name)
+ "Parse X Display name NAME."
+ (let ((host (replace-regexp-in-string "\\(.*\\):.*" "\\1" name))
+ (display (replace-regexp-in-string ".*:\\([^\\.]+\\).*" "\\1" name))
+ (screen
+ (replace-regexp-in-string ".*:[^\\.]+\\.?\\(.*\\)" "\\1" name)))
+ (setq display (string-to-number display))
+ (setq screen (if (string= "" screen) 0 (string-to-number screen)))
+ `((host . ,host) (display . ,display) (screen . ,screen))))
+
+(defun xcb:create-auth-info ()
+ "Create the default `auth-info'."
+ (let ((xauth-output (shell-command-to-string
+ (concat
+ "xauth list "
+ (replace-regexp-in-string "^localhost" ""
+ (getenv "DISPLAY"))
+ " 2>/dev/null")))
+ (name "MIT-MAGIC-COOKIE-1") ;only support MIT-MAGIC-COOKIE-1 protocol.
+ (data ""))
+ (if (string= "" xauth-output)
+ ;; No xauth entry available.
+ (setq name "")
+ (setq xauth-output (split-string xauth-output))
+ (if (string= name (car (last xauth-output 2)))
+ ;; The auth data is a 128-bit hex string.
+ (setq data (car (last xauth-output))
+ data
+ (concat
+ (cl-loop for i in (number-sequence 0 30 2)
+ collect (string-to-number
+ (substring data
+ i (+ i 2))
+ 16))))
+ ;; No xauth entry available.
+ (setq name "")))
+ (make-instance 'xcb:auth-info :name name :data data)))
+
+(defun xcb:connect-to-socket (&optional socket auth-info)
+ "Connect to X server with socket SOCKET and authentication info AUTH-INFO."
+ (unless (or socket (frame-parameter nil 'display))
+ (error "[XELB] No X display available"))
+ (let (display)
+ (if socket
+ ;; As there is no general way to deduce the display name from an X11
+ ;; socket, we assume a standard SOCKET name and hope for the best.
+ (setq display
+ (concat ":" ;local
+ (replace-regexp-in-string "^.*?\\([0-9.]+\\)$" "\\1"
+ socket)))
+ (setq display (frame-parameter nil 'display)
+ socket (xcb:display->socket display)))
+ (let* ((process (make-network-process :name "XELB" :family 'local
+ :service socket))
+ (auth (if auth-info auth-info (xcb:create-auth-info)))
+ (connection (make-instance 'xcb:connection
+ :process process :display display
+ :auth-info auth :socket socket)))
+ (xcb:-connect connection)
+ connection)))
+
+(cl-defmethod xcb:-connect ((obj xcb:connection))
+ "Connect to X server."
+ (let* ((process (slot-value obj 'process))
+ (auth-info (slot-value obj 'auth-info))
+ (aname (slot-value auth-info 'name))
+ (adata (slot-value auth-info 'data)))
+ (set-process-plist process
+ (plist-put (process-plist process) 'connection obj))
+ (set-process-coding-system process 'binary 'binary)
+ (set-process-filter process #'xcb:-connection-setup-filter)
+ (set-process-sentinel process #'xcb:-connection-sentinel)
+ (process-send-string ;send setup packet
+ process
+ (apply #'unibyte-string
+ (append ;convert vector to string
+ (xcb:marshal
+ (make-instance 'xcb:SetupRequest
+ :byte-order (if xcb:lsb #x6c #x42)
+ :protocol-major-version 11
+ :protocol-minor-version 0
+ :authorization-protocol-name-len (length aname)
+ :authorization-protocol-data-len (length adata)
+ :authorization-protocol-name aname
+ :authorization-protocol-data adata))
+ nil)))
+ ;; Wait for setup data ready
+ (with-timeout (xcb:connection-timeout (xcb:disconnect obj)
+ (error "[XELB] Connection timeout"))
+ (while (not (slot-value obj 'setup-data))
+ (accept-process-output process 1 nil 1)))))
+
+(defconst xcb:-SEQUENCE-SEGMENT-MASK (lognot #xFFFF))
+
+(defun xcb:-connection-setup-filter (process message)
+ "Process filter used during connection setup."
+ (let* ((connection (plist-get (process-plist process) 'connection))
+ (cache (vconcat (slot-value connection 'message-cache) message)))
+ (setf (slot-value connection 'message-cache) cache)
+ (unless (or (slot-value connection 'lock)
+ ;; Shorter than the setup header.
+ (> 8 (length cache)))
+ (setf (slot-value connection 'lock) t)
+ (let ((data-len (+ 8 (* 4 (if xcb:lsb
+ (xcb:-unpack-u2-lsb cache 6)
+ (xcb:-unpack-u2 cache 6)))))
+ obj)
+ (when (>= (length cache) data-len)
+ (xcb:-log "Setup response: %s" cache)
+ (pcase (aref cache 0)
+ (0
+ ;; Connection failed.
+ (setq obj (make-instance 'xcb:SetupFailed))
+ (xcb:unmarshal obj cache)
+ (setq cache (substring cache data-len))
+ (error "[XELB] Connection failed: %s" (slot-value obj 'reason)))
+ (1
+ ;; Connection established.
+ (setf (slot-value connection 'message-cache) [])
+ (set-process-filter process #'xcb:-connection-filter)
+ (setq obj (make-instance 'xcb:Setup))
+ (xcb:unmarshal obj cache)
+ (setq cache (substring cache data-len))
+ (setf (slot-value connection 'setup-data) obj)
+ (setf (slot-value connection 'connected) t))
+ (2
+ ;; Authentication required.
+ (setq obj (make-instance 'xcb:SetupAuthenticate))
+ (xcb:unmarshal obj cache)
+ (setq cache (substring cache data-len))
+ (error "[XELB] Authentication not supported: %s"
+ (slot-value obj 'reason)))
+ (x (error "Unrecognized setup status: %d" x)))))
+ (setf (slot-value connection 'lock) nil))))
+
+(defun xcb:-connection-sentinel (process _event)
+ "Process sentinel used to teardown the connection on disconnect."
+ (unless (process-live-p process)
+ (xcb:disconnect (plist-get (process-plist process) 'connection))))
+
+(cl-defmethod xcb:-convert-sequence ((obj xcb:connection) sequence16)
+ "Convert 16-bit sequence number SEQUENCE16 (read from a packet).
+
+The result would be 29 or 61 bits, depending on the machine."
+ (with-slots (request-sequence) obj
+ ;; Assume there are no more than #xFFFF requests sent since the
+ ;; request corresponding to this packet was made. Because errors
+ ;; and replies are always read out in the process filter, this
+ ;; assumption is quite safe.
+ (let ((sequence (logior (logand request-sequence
+ xcb:-SEQUENCE-SEGMENT-MASK)
+ sequence16)))
+ ;; `xcb:-cache-request' ensures sequence number never wraps.
+ (when (> sequence request-sequence)
+ (cl-decf sequence #x10000))
+ sequence)))
+
+(defun xcb:-connection-filter (process message)
+ "Filter function for an X connection.
+
+Concurrency is disabled as it breaks the orders of errors, replies and events."
+ (let* ((connection (plist-get (process-plist process) 'connection))
+ ;; Temporarily disable GC here as typically it's about to do
+ ;; lots of marshaling/unmarshaling.
+ (gc-cons-threshold most-positive-fixnum)
+ (cache (vconcat (slot-value connection 'message-cache) message))
+ (cache-length (length cache)))
+ (setf (slot-value connection 'message-cache) cache)
+ (unless (slot-value connection 'lock)
+ ;; Start parsing message
+ (setf (slot-value connection 'lock) t)
+ ;; Process error/reply/event
+ (catch 'break
+ (while (<= 32 (length cache))
+ (pcase (aref cache 0)
+ (0 ;error
+ (xcb:-log "Error received: %s" (substring cache 0 32))
+ (let ((sequence (funcall (if xcb:lsb #'xcb:-unpack-u2-lsb
+ #'xcb:-unpack-u2)
+ cache 2))
+ (plist (slot-value connection 'error-plist))
+ struct)
+ (setq sequence (xcb:-convert-sequence connection sequence))
+ (when (plist-member plist sequence)
+ (setq struct (plist-get plist sequence))
+ (setf (slot-value connection 'error-plist)
+ (plist-put plist sequence
+ (push `(,(aref cache 1) .
+ ,(substring cache 0 32))
+ struct))))
+ (setq cache (substring cache 32))
+ (setf (slot-value connection 'last-seen-sequence) sequence)))
+ (1 ;reply
+ (let* ((reply-words (funcall (if xcb:lsb #'xcb:-unpack-u4-lsb
+ #'xcb:-unpack-u4)
+ cache 4))
+ (reply-length (+ 32 (* 4 reply-words)))
+ struct sequence plist)
+ (when (< (length cache) reply-length) ;too short, do next time
+ (throw 'break nil))
+ (xcb:-log "Reply received: %s" (substring cache 0 reply-length))
+ (setq sequence (funcall (if xcb:lsb #'xcb:-unpack-u2-lsb
+ #'xcb:-unpack-u2)
+ cache 2)
+ sequence (xcb:-convert-sequence connection sequence))
+ (setq plist (slot-value connection 'reply-plist))
+ (setq struct (plist-get plist sequence))
+ (when struct
+ (setf (slot-value connection 'reply-plist)
+ (plist-put plist sequence
+ (if (symbolp struct)
+ ;; Single reply or
+ ;; first reply for multiple replies
+ (list struct
+ (substring cache 0 reply-length))
+ ;; Multiple replies
+ `(,(car struct) ,@(cdr struct)
+ ,(substring cache 0 reply-length))))))
+ (setq cache (substring cache reply-length))
+ (setf (slot-value connection 'last-seen-sequence) sequence)))
+ (x ;event
+ (let (synthetic listener event-length)
+ (when (/= 0 (logand x #x80)) ;synthetic event
+ (setq synthetic t
+ x (logand x #x7f))) ;low 7 bits is the event number
+ (setq listener
+ (plist-get (slot-value connection 'event-plist) x))
+ (pcase listener
+ (`xge
+ (setq event-length (funcall (if xcb:lsb
+ #'xcb:-unpack-u4-lsb
+ #'xcb:-unpack-u4)
+ cache 4)
+ ;; event-length indicates additional words to the
+ ;; first 32 bytes.
+ event-length (+ 32 (* 4 event-length)))
+ (when (< (length cache) event-length)
+ ;; Too short.
+ (throw 'break nil))
+ (setq listener
+ (compat-call plist-get
+ (slot-value connection 'event-plist)
+ (vector (aref cache 1)
+ (funcall
+ (if xcb:lsb
+ #'xcb:-unpack-u2-lsb
+ #'xcb:-unpack-u2)
+ cache 8))
+ #'equal)))
+ (`xkb
+ (setq listener
+ (compat-call plist-get
+ (slot-value connection 'event-plist)
+ (vector (aref cache 1))
+ #'equal))))
+ ;; Conventional events are 32 bytes in size.
+ (unless event-length
+ (setq event-length 32))
+ (when listener
+ (with-slots (event-queue) connection
+ (setf event-queue (nconc event-queue
+ `([,listener
+ ,(substring cache 0
+ event-length)
+ ,synthetic])))))
+ (xcb:-log "Event received: %s" (substring cache 0 event-length))
+ (setq cache (substring cache event-length)))))))
+ (setf (slot-value connection 'lock) nil))
+ (unless (slot-value connection 'lock)
+ (with-slots (message-cache) connection
+ (let ((current-cache-length (length message-cache)))
+ (setf message-cache
+ (substring message-cache (- cache-length (length cache))))
+ (when (/= current-cache-length cache-length)
+ (xcb:-connection-filter process []))))
+ (xcb:-process-events connection))))
+
+(cl-defmethod xcb:-process-events ((conn xcb:connection))
+ "Process cached events."
+ (with-slots (event-lock event-queue) conn
+ (unless (< 0 event-lock)
+ (cl-incf event-lock)
+ (unwind-protect
+ (let (event data synthetic)
+ (while (setq event (pop event-queue))
+ (setq data (aref event 1)
+ synthetic (aref event 2))
+ (dolist (listener (aref event 0))
+ (xcb-debug:backtrace-on-error
+ (funcall listener data synthetic)))))
+ (cl-decf event-lock)))))
+
+(cl-defmethod xcb:disconnect ((obj xcb:connection))
+ "Disconnect from X server."
+ (when (slot-value obj 'connected)
+ (ignore-errors (xcb:flush obj))
+ (delete-process (slot-value obj 'process))
+ ;; Reset every slot to its default value
+ (let ((slots (eieio-class-slots 'xcb:connection)))
+ (dolist (slot slots)
+ (setf (slot-value obj (eieio-slot-descriptor-name slot))
+ (eieio-oref-default obj (eieio-slot-descriptor-name slot)))))))
+
+;;;; Other routines
+
+(cl-defmethod xcb:get-setup ((obj xcb:connection))
+ "Get the setup info of X connection OBJ."
+ (slot-value obj 'setup-data))
+
+(cl-defmethod xcb:get-socket ((obj xcb:connection))
+ "Get the socket of X connection OBJ."
+ (slot-value obj 'socket))
+
+(cl-defmethod xcb:get-maximum-request-length ((obj xcb:connection))
+ "Get maximum request length from setup data."
+ (slot-value (xcb:get-setup obj) 'maximum-request-length))
+
+(cl-defmethod xcb:+event ((obj xcb:connection) event listener)
+ "Attach function LISTENER to event EVENT.
+
+Note that event listeners attached this way are shared with the super- and sub-
+classes of EVENT (since they have the same event number)."
+ (let* ((event-number (xcb:-error-or-event-class->number obj event))
+ (plist (slot-value obj 'event-plist))
+ key listeners)
+ (when (consp event-number)
+ (setq key (car event-number)
+ event-number (cdr event-number)
+ listeners (plist-get plist key))
+ ;; Add a placeholder.
+ (setf (slot-value obj 'event-plist)
+ (plist-put plist key
+ (if (child-of-class-p event 'xcb:-generic-event)
+ 'xge 'xkb))))
+ (setq listeners (compat-call plist-get plist event-number #'equal))
+ (setf (slot-value obj 'event-plist)
+ (compat-call plist-put plist event-number
+ (append listeners (list listener)) #'equal))))
+
+(cl-defmethod xcb:flush ((obj xcb:connection))
+ "Flush request data to X server."
+ (let ((cache (slot-value obj 'request-cache)))
+ (when (< 0 (length cache))
+ (setf (slot-value obj 'request-cache) []) ;should be cleared ASAP
+ (cl-incf (slot-value obj 'event-lock))
+ (unwind-protect
+ (process-send-string (slot-value obj 'process)
+ (apply #'unibyte-string (append cache nil)))
+ (cl-decf (slot-value obj 'event-lock)))
+ (xcb:-process-events obj))))
+
+(cl-defmethod xcb:get-extension-data ((obj xcb:connection) namespace)
+ "Fetch the extension data from X server (block until data is retrieved)."
+ (let* ((plist (slot-value obj 'extension-plist))
+ (data (plist-get plist namespace)))
+ (if (eieio-object-p data)
+ data
+ (when (not data) ;the request has not been made
+ (xcb:prefetch-extension-data obj namespace))
+ (setq data (xcb:-+reply obj (plist-get (slot-value obj 'extension-plist)
+ namespace)))
+ (when (cadr data) ;has error
+ (error "[XELB] %s" (cadr data)))
+ (setq data (car data))
+ (setf (slot-value obj 'extension-plist) (plist-put plist namespace data))
+ ;; Cache major opcode, first event and first error if possible
+ (with-slots (present major-opcode first-event first-error) data
+ (when (= 1 present)
+ (setf (slot-value obj 'extension-opcode-plist)
+ (plist-put (slot-value obj 'extension-opcode-plist)
+ namespace major-opcode)
+ (slot-value obj 'extension-first-event-alist)
+ (nconc (slot-value obj 'extension-first-event-alist)
+ `((,namespace . ,first-event)))
+ (slot-value obj 'extension-first-error-alist)
+ (nconc (slot-value obj 'extension-first-error-alist)
+ `((,namespace . ,first-error))))))
+ data)))
+
+(cl-defmethod xcb:prefetch-extension-data ((obj xcb:connection) namespace)
+ "Prefetch the extension data from X server."
+ (when (not (plist-get (slot-value obj 'extension-plist) namespace))
+ (let* ((extension-xname
+ (symbol-value (intern-soft (concat (symbol-name namespace)
+ ":-extension-xname"))))
+ (sequence
+ (xcb:-+request obj
+ (make-instance 'xcb:QueryExtension
+ :name-len (length extension-xname)
+ :name extension-xname))))
+ (setf (slot-value obj 'extension-plist)
+ (plist-put (slot-value obj 'extension-plist) namespace sequence))
+ (xcb:flush obj))))
+
+(cl-defmethod xcb:generate-id ((obj xcb:connection))
+ "Generate new X ID."
+ (let* ((setup (xcb:get-setup obj))
+ (base (slot-value setup 'resource-id-base))
+ (mask (slot-value setup 'resource-id-mask))
+ (increment (logand mask (- mask)))
+ (xid (+ (slot-value obj 'xid) increment)))
+ (when (> xid mask)
+ (error "[XELB] Unable to allocate new X resource ID"))
+ (setf (slot-value obj 'xid) xid)
+ (logior base xid)))
+
+;;;; Request related
+
+(cl-defmethod xcb:-cache-request ((obj xcb:connection) request)
+ "Send (or cache) a request and return the sequence number."
+ (let* ((namespace
+ (intern (replace-regexp-in-string
+ ":[^:]+$" "" (symbol-name
+ (eieio-object-class request)))))
+ (extension-opcode
+ (plist-get (slot-value obj 'extension-opcode-plist) namespace))
+ (msg (xcb:marshal request))
+ (len (+ 2 (length msg)))
+ (cache (slot-value obj 'request-cache)))
+ (when extension-opcode
+ (setq msg (vconcat (vector extension-opcode) msg))
+ (cl-incf len))
+ (when (> 2 (length msg)) ;for short message (e.g. GetInputFocus)
+ (setq msg (vconcat msg [0]))
+ (cl-incf len))
+ (setq msg
+ (vconcat (substring msg 0 2)
+ (funcall (if (slot-value request '~lsb) #'xcb:-pack-u2-lsb
+ #'xcb:-pack-u2)
+ (ceiling len 4))
+ (substring msg 2)
+ (make-vector (% (- 4 (% len 4)) 4) 0))) ;required sometimes
+ (when (< (xcb:get-maximum-request-length obj)
+ (+ (length msg) (length cache))) ;flush on cache full
+ (xcb:flush obj)
+ (setq cache []))
+ (with-slots (request-cache request-sequence last-seen-sequence) obj
+ (when (>= request-sequence most-positive-fixnum)
+ ;; Force wrapping the sequence number.
+ (xcb:aux:sync obj)
+ (setf request-sequence 0
+ last-seen-sequence 0))
+ (setf request-cache (vconcat cache msg)
+ request-sequence (1+ request-sequence))
+ (xcb:-log "Cache request #%d: %s" request-sequence msg)
+ request-sequence)))
+
+(cl-defmethod xcb:-+request ((obj xcb:connection) request)
+ (let ((sequence (xcb:-cache-request obj request))
+ (class (eieio-object-class request)))
+ (when (fboundp (xcb:-request-class->reply-class class))
+ ;; This request has a reply
+ (setf (slot-value obj 'reply-plist) ;require reply
+ (plist-put (slot-value obj 'reply-plist) sequence class))
+ (setf (slot-value obj 'error-plist) ;require error
+ (plist-put (slot-value obj 'error-plist) sequence nil)))
+ sequence))
+
+(defmacro xcb:+request (obj request)
+ "Make a request.
+
+If the request has a reply, then errors will also be available (if any).
+Otherwise no error will ever be reported."
+ (declare (indent 2))
+ `(xcb:-+request ,obj ,request))
+
+(cl-defmethod xcb:-+request-checked ((obj xcb:connection) request)
+ (when (fboundp
+ (xcb:-request-class->reply-class (eieio-object-class request)))
+ (error "This method shall not be called with request that has a reply"))
+ (let ((sequence (xcb:-cache-request obj request)))
+ (setf (slot-value obj 'error-plist)
+ (plist-put (slot-value obj 'error-plist) sequence nil))
+ sequence))
+
+(defmacro xcb:+request-checked (obj request)
+ "Make a request (which have no reply) and check for errors."
+ (declare (indent 2))
+ `(xcb:-+request-checked ,obj ,request))
+
+(cl-defmethod xcb:-+request-unchecked ((obj xcb:connection) request)
+ (unless (fboundp
+ (xcb:-request-class->reply-class (eieio-object-class request)))
+ (error "This method shall not be called with request that has no reply"))
+ (let ((sequence (xcb:-cache-request obj request)))
+ (setf (slot-value obj 'reply-plist)
+ (plist-put (slot-value obj 'reply-plist)
+ sequence (eieio-object-class request)))
+ sequence))
+
+(defmacro xcb:+request-unchecked (obj request)
+ "Make a request (which have at least a reply) and discard any error."
+ (declare (indent 2))
+ `(xcb:-+request-unchecked ,obj ,request))
+
+(cl-defmethod xcb:-+reply ((obj xcb:connection) sequence &optional multiple)
+ (unless (plist-member (slot-value obj 'reply-plist) sequence)
+ (error "This method is intended for requests with replies"))
+ (xcb:flush obj) ;or we may have to wait forever
+ (if multiple
+ ;; Multiple replies
+ (xcb:aux:sync obj)
+ ;; Single reply
+ (let ((process (slot-value obj 'process)))
+ ;; Wait until the request processed
+ (cl-incf (slot-value obj 'event-lock))
+ (unwind-protect
+ (with-timeout (xcb:connection-timeout
+ (warn "[XELB] Retrieve reply timeout"))
+ (while (and (> sequence (slot-value obj 'last-seen-sequence))
+ (<= sequence (slot-value obj 'request-sequence)))
+ (accept-process-output process 1 nil 1)))
+ (cl-decf (slot-value obj 'event-lock)))
+ (xcb:-process-events obj)))
+ (let* ((reply-plist (slot-value obj 'reply-plist))
+ (reply-data (plist-get reply-plist sequence))
+ (error-plist (slot-value obj 'error-plist))
+ (error-data (plist-get error-plist sequence))
+ class-name reply replies error errors)
+ (if (symbolp reply-data)
+ (setq replies nil) ;no reply
+ (setq class-name (xcb:-request-class->reply-class (car reply-data)))
+ (if multiple
+ ;; Multiple replies
+ (dolist (i (cdr reply-data))
+ (setq reply (make-instance class-name))
+ (xcb:unmarshal reply i)
+ (setq replies (nconc replies (list reply))))
+ ;; Single reply
+ (setq reply-data (cadr reply-data)
+ replies (make-instance class-name))
+ (xcb:unmarshal replies reply-data)))
+ (setq errors
+ (mapcar (lambda (i)
+ (setq error (make-instance
+ (xcb:-error-number->class obj (car i))))
+ (xcb:unmarshal error (cdr i))
+ error)
+ error-data))
+ (cl-remf (slot-value obj 'reply-plist) sequence)
+ (cl-remf (slot-value obj 'error-plist) sequence)
+ (list replies errors)))
+
+(defmacro xcb:+reply (obj sequence &optional multiple)
+ "Return the reply of a request of which the sequence number is SEQUENCE.
+
+If MULTIPLE is nil, the return value is the only reply, or it returns a list of
+all replies.
+
+WARNING: for requests that have multiple replies, you MUST supply a non-nil
+MULTIPLE value, or some replies may be lost!"
+ (declare (indent 2))
+ `(xcb:-+reply ,obj ,sequence ,multiple))
+
+(cl-defmethod xcb:-request-check ((obj xcb:connection) sequence)
+ (when (plist-member (slot-value obj 'reply-plist) sequence)
+ (error "This method is intended for requests with no reply"))
+ (xcb:flush obj) ;or we may have to wait forever
+ (let ((error-plist (slot-value obj 'error-plist))
+ error-obj tmp)
+ (unless (plist-member error-plist sequence)
+ (error "This method shall be called after `xcb:+request-checked'"))
+ (when (> sequence (slot-value obj 'last-seen-sequence))
+ (xcb:aux:sync obj)) ;wait until the request is processed
+ (setq error-obj
+ (mapcar (lambda (i)
+ (setq tmp (cdr i)
+ i (make-instance
+ (xcb:-error-number->class obj (car i))))
+ (xcb:unmarshal i tmp)
+ i)
+ (plist-get error-plist sequence)))
+ (cl-remf (slot-value obj 'error-plist) sequence)
+ error-obj))
+
+(defmacro xcb:request-check (obj sequence)
+ "Return the error of the request of which the sequence number is SEQUENCE.
+
+The sequence number shall be returned by `xcb:+request-checked'."
+ (declare (indent 2))
+ `(xcb:-request-check ,obj ,sequence))
+
+(defmacro xcb:+request+reply (obj request &optional multiple)
+ "Make a request and return its replies and errors.
+
+If MULTIPLE is nil, the return value is a list of which the car is the only
+reply and the cadr a list of errors. Otherwise, the car of the result is a
+list of replies.
+
+WARNING: for requests that have multiple replies, you MUST supply a non-nil
+MULTIPLE value, or some replies may be lost!"
+ (declare (indent 2))
+ `(xcb:-+reply ,obj (xcb:-+request ,obj ,request) ,multiple))
+
+(defmacro xcb:+request-checked+request-check (obj request)
+ "Make a request (which has no reply) and return the errors."
+ (declare (indent 2))
+ `(xcb:-request-check ,obj (xcb:-+request-checked ,obj ,request)))
+
+(defmacro xcb:+request-unchecked+reply (obj request &optional multiple)
+ "Make a request (that has at least one reply) and only return the reply.
+
+If MULTIPLE is nil, the return value is the only reply, or it returns a list of
+all replies.
+
+WARNING: for requests that have multiple replies, you MUST supply a non-nil
+MULTIPLE value, or some replies may be lost!"
+ (declare (indent 2))
+ `(car (xcb:-+reply ,obj (xcb:-+request-unchecked ,obj ,request) ,multiple)))
+
+;;;; Misc.
+
+(cl-defmethod xcb:aux:sync ((obj xcb:connection))
+ "Force sync with X server.
+
+Sync by sending a GetInputFocus request and waiting until it's processed."
+ (let ((sequence (xcb:-cache-request obj (make-instance 'xcb:GetInputFocus)))
+ (process (slot-value obj 'process)))
+ (xcb:flush obj)
+ ;; Wait until request processed
+ (cl-incf (slot-value obj 'event-lock))
+ (unwind-protect
+ (with-timeout (xcb:connection-timeout (warn "[XELB] Sync timeout"))
+ (while (and (> sequence (slot-value obj 'last-seen-sequence))
+ ;; In case the sequence number has been wrapped.
+ (<= sequence (slot-value obj 'request-sequence)))
+ (accept-process-output process 1 nil 1)))
+ (cl-decf (slot-value obj 'event-lock)))
+ (xcb:-process-events obj)
+ ;; Discard any reply or error.
+ (cl-remf (slot-value obj 'reply-plist) sequence)
+ (cl-remf (slot-value obj 'error-plist) sequence)))
+
+(cl-defmethod xcb:-error-or-event-class->number ((obj xcb:connection) class)
+ "Return the error/event number of a error/event class CLASS.
+
+If CLASS is a generic event, return (XGE-CODE . [EXTENSION EVTYPE]);
+Or if it's an XKB event, return (XKB-EVENT-CODE [XKB-CODE])."
+ (unless (symbolp class) (setq class (eieio-class-name class)))
+ (let ((prefix (replace-regexp-in-string ":[^:]+$" ":" (symbol-name class)))
+ first-code alist result parents)
+ (cond
+ ((child-of-class-p class 'xcb:-error)
+ ;; Error.
+ (if (string= prefix "xcb:")
+ (setq first-code 0
+ alist xcb:error-number-class-alist)
+ (setq first-code
+ (cdr (assq (intern (substring prefix 0 -1))
+ (slot-value obj
+ 'extension-first-error-alist)))
+ alist (symbol-value
+ (intern-soft (concat prefix
+ "error-number-class-alist")))))
+ (setq result (car (rassq class alist)))
+ (when result
+ (setq result (+ first-code result))))
+ ((child-of-class-p class 'xcb:-generic-event)
+ ;; Generic event.
+ (setq alist (symbol-value
+ (intern-soft (concat prefix "xge-number-class-alist")))
+ result (plist-get (slot-value obj 'extension-opcode-plist)
+ (intern-soft (substring prefix 0 -1))))
+ ;; Ensure the extension has been initialized.
+ (when result
+ (setq result `(35 . [,result ,(car (rassq class alist))]))))
+ ((string= prefix "xcb:xkb:")
+ ;; XKB event.
+ (eval-and-compile (require 'xcb-xkb))
+ ;; XKB uses a single event code for all events.
+ (setq result (cdr (assq 'xcb:xkb
+ (slot-value obj 'extension-first-event-alist))))
+ ;; Ensure the XKB extension has been initialized.
+ (when result
+ (setq alist xcb:xkb:event-number-class-alist
+ result `(,result . [,(car (rassq class alist))]))))
+ (t
+ ;; Other event.
+ (if (string= prefix "xcb:")
+ (setq first-code 0
+ alist xcb:event-number-class-alist)
+ (setq first-code
+ (cdr (assq (intern (substring prefix 0 -1))
+ (slot-value obj 'extension-first-event-alist)))
+ alist (symbol-value
+ (intern-soft (concat prefix
+ "event-number-class-alist")))))
+ (setq result (car (rassq class alist)))
+ (when result
+ (setq result (+ first-code result)))))
+ (unless result
+ ;; Fallback to use the error/event number of one superclass. Thus if the
+ ;; error/event number of a subclass differs from that of its parent, it
+ ;; must be explicitly pointed out.
+ (setq parents (eieio-class-parents class))
+ (while (and parents (not result))
+ (setq result (xcb:-error-or-event-class->number obj (pop parents)))))
+ result))
+
+(cl-defmethod xcb:-event-number->class ((obj xcb:connection) number)
+ "Return the event class that has the event number NUMBER.
+
+Note that when multiple events have the same number, only the top-most
+superclass will be returned."
+ (if (or (< number 64) (> number 127))
+ ;; Xproto event
+ (cdr (assoc number xcb:event-number-class-alist))
+ ;; Extension event
+ (let ((first-event number)
+ namespace index alist)
+ (while (and (not namespace) (>= first-event 64))
+ (setq namespace
+ (car (rassoc first-event
+ (slot-value obj 'extension-first-event-alist)))
+ first-event (1- first-event)))
+ (setq index (- number first-event 1))
+ (setq alist (intern-soft (concat (symbol-name namespace)
+ ":event-number-class-alist")))
+ (cdr (assoc index (symbol-value alist))))))
+
+(cl-defmethod xcb:-error-number->class ((obj xcb:connection) number)
+ "Return the error class that has the error number NUMBER.
+
+Note that when multiple errors have the same number, only the top-most
+superclass will be returned."
+ (if (or (< number 128) (> number 255))
+ ;; Xproto error
+ (cdr (assoc number xcb:error-number-class-alist))
+ ;; Extension error
+ (let ((first-error number)
+ namespace index alist)
+ (while (and (not namespace) (>= first-error 128))
+ (setq namespace
+ (car (rassoc first-error
+ (slot-value obj 'extension-first-error-alist)))
+ first-error (1- first-error)))
+ (setq index (- number first-error 1))
+ (setq alist (intern-soft (concat (symbol-name namespace)
+ ":error-number-class-alist")))
+ (cdr (assoc index (symbol-value alist))))))
+
+
+
+(provide 'xcb)
+
+;;; xcb.el ends here
diff --git a/elpa/xelb-0.20/xcb.elc b/elpa/xelb-0.20/xcb.elc
new file mode 100644
index 0000000..de0134a
--- /dev/null
+++ b/elpa/xelb-0.20/xcb.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xelb-autoloads.el b/elpa/xelb-0.20/xelb-autoloads.el
new file mode 100644
index 0000000..2492fd9
--- /dev/null
+++ b/elpa/xelb-0.20/xelb-autoloads.el
@@ -0,0 +1,253 @@
+;;; xelb-autoloads.el --- automatically extracted autoloads (do not edit) -*- lexical-binding: t -*-
+;; Generated by the `loaddefs-generate' function.
+
+;; This file is part of GNU Emacs.
+
+;;; Code:
+
+(add-to-list 'load-path (or (and load-file-name (directory-file-name (file-name-directory load-file-name))) (car load-path)))
+
+
+
+;;; Generated autoloads from xcb.el
+
+(register-definition-prefixes "xcb" '("xcb:"))
+
+
+;;; Generated autoloads from xcb-bigreq.el
+
+(register-definition-prefixes "xcb-bigreq" '("xcb:bigreq:"))
+
+
+;;; Generated autoloads from xcb-composite.el
+
+(register-definition-prefixes "xcb-composite" '("xcb:composite:"))
+
+
+;;; Generated autoloads from xcb-cursor.el
+
+(register-definition-prefixes "xcb-cursor" '("xcb:cursor:-"))
+
+
+;;; Generated autoloads from xcb-damage.el
+
+(register-definition-prefixes "xcb-damage" '("xcb:damage:"))
+
+
+;;; Generated autoloads from xcb-dbe.el
+
+(register-definition-prefixes "xcb-dbe" '("xcb:dbe:"))
+
+
+;;; Generated autoloads from xcb-debug.el
+
+(register-definition-prefixes "xcb-debug" '("xcb-debug:"))
+
+
+;;; Generated autoloads from xcb-dpms.el
+
+(register-definition-prefixes "xcb-dpms" '("xcb:dpms:"))
+
+
+;;; Generated autoloads from xcb-dri2.el
+
+(register-definition-prefixes "xcb-dri2" '("xcb:dri2:"))
+
+
+;;; Generated autoloads from xcb-dri3.el
+
+(register-definition-prefixes "xcb-dri3" '("xcb:dri3:"))
+
+
+;;; Generated autoloads from xcb-ewmh.el
+
+(register-definition-prefixes "xcb-ewmh" '("xcb:ewmh:"))
+
+
+;;; Generated autoloads from xcb-ge.el
+
+(register-definition-prefixes "xcb-ge" '("xcb:ge:"))
+
+
+;;; Generated autoloads from xcb-glx.el
+
+(register-definition-prefixes "xcb-glx" '("xcb:glx:"))
+
+
+;;; Generated autoloads from xcb-icccm.el
+
+(register-definition-prefixes "xcb-icccm" '("xcb:icccm:"))
+
+
+;;; Generated autoloads from xcb-keysyms.el
+
+(register-definition-prefixes "xcb-keysyms" '("xcb:keysyms:"))
+
+
+;;; Generated autoloads from xcb-present.el
+
+(register-definition-prefixes "xcb-present" '("xcb:present:"))
+
+
+;;; Generated autoloads from xcb-randr.el
+
+(register-definition-prefixes "xcb-randr" '("xcb:randr:"))
+
+
+;;; Generated autoloads from xcb-record.el
+
+(register-definition-prefixes "xcb-record" '("xcb:record:"))
+
+
+;;; Generated autoloads from xcb-render.el
+
+(register-definition-prefixes "xcb-render" '("xcb:render:"))
+
+
+;;; Generated autoloads from xcb-renderutil.el
+
+(register-definition-prefixes "xcb-renderutil" '("xcb:renderutil:"))
+
+
+;;; Generated autoloads from xcb-res.el
+
+(register-definition-prefixes "xcb-res" '("xcb:res:"))
+
+
+;;; Generated autoloads from xcb-screensaver.el
+
+(register-definition-prefixes "xcb-screensaver" '("xcb:screensaver:"))
+
+
+;;; Generated autoloads from xcb-shape.el
+
+(register-definition-prefixes "xcb-shape" '("xcb:shape:"))
+
+
+;;; Generated autoloads from xcb-shm.el
+
+(register-definition-prefixes "xcb-shm" '("xcb:shm:"))
+
+
+;;; Generated autoloads from xcb-sync.el
+
+(register-definition-prefixes "xcb-sync" '("xcb:sync:"))
+
+
+;;; Generated autoloads from xcb-systemtray.el
+
+(register-definition-prefixes "xcb-systemtray" '("xcb:"))
+
+
+;;; Generated autoloads from xcb-types.el
+
+(register-definition-prefixes "xcb-types" '("xcb:"))
+
+
+;;; Generated autoloads from xcb-xc_misc.el
+
+(register-definition-prefixes "xcb-xc_misc" '("xcb:xc_misc:"))
+
+
+;;; Generated autoloads from xcb-xembed.el
+
+(register-definition-prefixes "xcb-xembed" '("xcb:xembed:"))
+
+
+;;; Generated autoloads from xcb-xevie.el
+
+(register-definition-prefixes "xcb-xevie" '("xcb:xevie:"))
+
+
+;;; Generated autoloads from xcb-xf86dri.el
+
+(register-definition-prefixes "xcb-xf86dri" '("xcb:xf86dri:"))
+
+
+;;; Generated autoloads from xcb-xf86vidmode.el
+
+(register-definition-prefixes "xcb-xf86vidmode" '("xcb:xf86vidmode:"))
+
+
+;;; Generated autoloads from xcb-xfixes.el
+
+(register-definition-prefixes "xcb-xfixes" '("xcb:xfixes:"))
+
+
+;;; Generated autoloads from xcb-xim.el
+
+(register-definition-prefixes "xcb-xim" '("xim:"))
+
+
+;;; Generated autoloads from xcb-xinerama.el
+
+(register-definition-prefixes "xcb-xinerama" '("xcb:xinerama:"))
+
+
+;;; Generated autoloads from xcb-xinput.el
+
+(register-definition-prefixes "xcb-xinput" '("xcb:xinput:"))
+
+
+;;; Generated autoloads from xcb-xkb.el
+
+(register-definition-prefixes "xcb-xkb" '("xcb:xkb:"))
+
+
+;;; Generated autoloads from xcb-xlib.el
+
+(register-definition-prefixes "xcb-xlib" '("xlib:X"))
+
+
+;;; Generated autoloads from xcb-xprint.el
+
+(register-definition-prefixes "xcb-xprint" '("xcb:xprint:"))
+
+
+;;; Generated autoloads from xcb-xproto.el
+
+(register-definition-prefixes "xcb-xproto" '("xcb:"))
+
+
+;;; Generated autoloads from xcb-xselinux.el
+
+(register-definition-prefixes "xcb-xselinux" '("xcb:xselinux:"))
+
+
+;;; Generated autoloads from xcb-xsettings.el
+
+(register-definition-prefixes "xcb-xsettings" '("xcb:xsettings:-"))
+
+
+;;; Generated autoloads from xcb-xtest.el
+
+(register-definition-prefixes "xcb-xtest" '("xcb:xtest:"))
+
+
+;;; Generated autoloads from xcb-xv.el
+
+(register-definition-prefixes "xcb-xv" '("xcb:xv:"))
+
+
+;;; Generated autoloads from xcb-xvmc.el
+
+(register-definition-prefixes "xcb-xvmc" '("xcb:xvmc:"))
+
+
+;;; Generated autoloads from xelb-test.el
+
+(register-definition-prefixes "xelb-test" '("xelb-test-"))
+
+;;; End of scraped data
+
+(provide 'xelb-autoloads)
+
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; no-native-compile: t
+;; coding: utf-8-emacs-unix
+;; End:
+
+;;; xelb-autoloads.el ends here
diff --git a/elpa/xelb-0.20/xelb-gen b/elpa/xelb-0.20/xelb-gen
new file mode 100755
index 0000000..daff68c
--- /dev/null
+++ b/elpa/xelb-0.20/xelb-gen
@@ -0,0 +1,726 @@
+#!/usr/bin/env -S emacs -Q --script
+;;; xelb-gen --- XELB Code Generator -*- lexical-binding: t; no-byte-compile: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+
+;; 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:
+
+;; 'xelb-gen' is responsible for converting XCB XML description files into
+;; Elisp libraries. Here are a few design guidelines:
+;; + The generated codes should be human-readable and conform to the Elisp
+;; coding conventions. Names mentioned in X specifications are preferred.
+;; + Deprecated features such as <valueparam> should be dropped, for
+;; - they would generate incompatible codes, and
+;; - they are probably already dropped upstream.
+;; + All documentations (within <doc> tags) and comments should be stripped
+;; out to reduce the overall amount of code. XELB application developers are
+;; then encouraged to refer to the corresponding specifications to get an
+;; authoritative explanation.
+
+;; This file is only intended to be run as a script.
+
+;; References:
+;; + xcb/proto (git://anongit.freedesktop.org/xcb/proto)
+
+;;; Code:
+
+(require 'cl-lib)
+(require 'eieio)
+(require 'pp)
+
+;; Only used to eliminate compile warnings when distributed.
+(require 'xcb-types nil t)
+
+;;;; Variables
+
+(defvar xelb-prefix "xcb:" "Namespace of this module.")
+
+(defvar xelb-error-alist nil "Record X errors in this module.")
+
+(defvar xelb-event-alist nil "Record X events in this module.")
+
+(defvar xelb-xge-alist nil "Record X generic events in this module.")
+
+(defvar xelb-imports nil "Record imported libraries.")
+
+(defvar xelb-pad-count -1 "<pad> node counter.")
+
+(defvar xelb-request-fields nil "Fields in the current request.")
+
+(defconst xelb-xproto-namespace "xproto:" "The namespace of the core protocol.")
+
+;;;; Helper functions
+
+(defsubst xelb-node-name (node)
+ "Return the tag name of node NODE."
+ (car node))
+
+(defsubst xelb-node-attr (node attr)
+ "Return the attribute ATTR of node NODE."
+ (cdr (assoc attr (cadr node))))
+
+(defsubst xelb-resolve-type (name)
+ "Resolve NAME relative to the current module."
+ (if (string-prefix-p xelb-xproto-namespace name)
+ ;; Defined explicitly.
+ (or (intern-soft (concat "xcb:" (substring name (length xelb-xproto-namespace))))
+ (error "Undefined type: %s" name))
+ (or
+ ;; defined by this extension
+ (intern-soft (concat xelb-prefix name))
+ ;; defined by the core protocol
+ (intern-soft (concat "xcb:" name))
+ ;; Defined by an imported extension.
+ (cl-dolist (i xelb-imports)
+ (when-let ((type (intern-soft (concat i name))))
+ (cl-return type)))
+ ;; Not defined.
+ (error "Undefined type: %s" name))))
+
+(defsubst xelb-node-type (node)
+ "Return the type of node NODE."
+ (xelb-resolve-type (xelb-node-attr node 'type)))
+
+(defsubst xelb-escape-name (name)
+ "Replace underscores in NAME with dashes."
+ (replace-regexp-in-string "_" "-" name))
+
+(defsubst xelb-node-name-escape (node)
+ "Return the tag name of node NODE and escape it."
+ (xelb-escape-name (xelb-node-name node)))
+
+(defsubst xelb-node-attr-escape (node attr)
+ "Return the attribute ATTR of node NODE and escape it."
+ (xelb-escape-name (xelb-node-attr node attr)))
+
+(defsubst xelb-node-subnodes (node &optional mark-auto-padding)
+ "Return all the subnodes of node NODE as a list.
+
+If MARK-AUTO-PADDING is non-nil, all <list>'s fitting for padding will include
+an `xelb-auto-padding' attribute."
+ (let ((subnodes (cddr node)))
+ (when mark-auto-padding
+ ;; Remove all <comment>'s and <doc>'s
+ (setq subnodes
+ (cl-delete-if (lambda (i) (or (eq 'comment (car i)) (eq 'doc (car i))))
+ subnodes))
+ (dotimes (i (1- (length subnodes)))
+ (when (and (eq 'list (xelb-node-name (elt subnodes i)))
+ (pcase (xelb-node-name (elt subnodes (1+ i)))
+ ((or `reply `pad))
+ (_ t)))
+ (setf (cadr (elt subnodes i))
+ (nconc (cadr (elt subnodes i)) `((xelb-auto-padding . t)))))))
+ subnodes))
+
+(defsubst xelb-node-subnode (node)
+ "Return the (only) subnode of node NODE with useless contents skipped."
+ (let ((result (xelb-node-subnodes node)))
+ (catch 'break
+ (dolist (i result)
+ (unless (and (listp i)
+ (or (eq (xelb-node-name i) 'comment)
+ (eq (xelb-node-name i) 'doc)))
+ (throw 'break i))))))
+
+(defun xelb-node-size (node)
+ "Return the size of NODE in bytes."
+ (pcase (xelb-node-name node)
+ (`pad (xelb-node-attr node 'bytes))
+ (`field (xelb-type-size (xelb-node-type node)))
+ (`list (* (xelb-type-size (xelb-node-type node))
+ (xelb-parse-expression (xelb-node-subnode node))))
+ ((or `comment `doc) 0)
+ (x (error "Unexpected element: <%s>" x))))
+
+(defun xelb-type-size (type &optional slot)
+ "Return size of TYPE in bytes."
+ (pcase (or (get type 'xcb--typealias) type)
+ (`xcb:-ignore 0)
+ ((or `xcb:-u1 `xcb:-i1 `xcb:void) 1)
+ ((or `xcb:-u2 `xcb:-i2) 2)
+ ((or `xcb:-u4 `xcb:-i4) 4)
+ (`xcb:-u8 8)
+ (`xcb:-pad (cl--slot-descriptor-initform slot))
+ (`xcb:-list
+ (let ((initform (cadr (cl--slot-descriptor-initform slot))))
+ (* (plist-get initform 'size)
+ (xelb-type-size (plist-get initform 'type)))))
+ ((and x (guard (child-of-class-p x 'xcb:-struct)))
+ (apply #'+
+ (mapcar (lambda (slot)
+ (xelb-type-size (cl--slot-descriptor-type slot) slot))
+ (eieio-class-slots x))))
+ (x (error "Unknown size of type: %s" x))))
+
+(defsubst xelb-generate-pad-name ()
+ "Generate a new slot name for <pad>."
+ (make-symbol (format "pad~%d" (cl-incf xelb-pad-count))))
+
+;;;; Entry & root element
+
+(defun xelb-parse (file)
+ "Parse an XCB protocol description file FILE (XML)."
+ (let ((pp-escape-newlines nil) ;do not escape newlines
+ (pp-default-function 'pp-28) ;avoid unecessary churn
+ result header)
+ (with-temp-buffer
+ (insert-file-contents file)
+ (setq result (libxml-parse-xml-region (point-min) (point-max)))
+ (unless (eq 'xcb (xelb-node-name result))
+ ;; There's an extra comment.
+ (setq result (xelb-node-subnode result)))
+ (cl-assert (eq 'xcb (xelb-node-name result)))
+ (setq header (xelb-node-attr result 'header))
+ (unless (string= header "xproto")
+ (setq xelb-prefix (concat xelb-prefix header ":")))
+ ;; Print header
+ (princ (format "\
+;;; xcb-%s.el --- X11 %s -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; 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 file was generated by 'xelb-gen' from '%s',
+;; which you can retrieve from <git://anongit.freedesktop.org/xcb/proto>.
+
+;;; Code:
+
+\(require 'xcb-types)
+
+"
+ header
+ (let ((extension-name (xelb-node-attr result
+ 'extension-name)))
+ (if extension-name
+ (concat extension-name " extension")
+ "core protocol"))
+ (file-name-nondirectory file)))
+ ;; Print extension info (if any)
+ (let ((extension-xname (xelb-node-attr result 'extension-xname))
+ (extension-name (xelb-node-attr result 'extension-name))
+ (major-version (xelb-node-attr result 'major-version))
+ (minor-version (xelb-node-attr result 'minor-version)))
+ (when extension-xname
+ (pp `(defconst ,(intern (concat xelb-prefix "-extension-xname"))
+ ,extension-xname)))
+ (when extension-name
+ (pp `(defconst ,(intern (concat xelb-prefix "-extension-name"))
+ ,extension-name)))
+ (when major-version
+ (pp `(defconst ,(intern (concat xelb-prefix "-major-version"))
+ ,(string-to-number major-version))))
+ (when minor-version
+ (pp `(defconst ,(intern (concat xelb-prefix "-minor-version"))
+ ,(string-to-number minor-version))))
+ (when (or extension-xname extension-name major-version minor-version)
+ (princ "\n")))
+ ;; Print contents
+ (dolist (i (xelb-node-subnodes result))
+ (let ((result (xelb-parse-top-level-element i)))
+ (when result ;skip <doc>, comments, etc
+ (dolist (j result)
+ (eval j) ;Make it immediately available.
+ (pp j))
+ (princ "\n"))))
+ ;; Print error/event alists
+ (when xelb-error-alist
+ (pp
+ `(defconst ,(intern (concat xelb-prefix "error-number-class-alist"))
+ ',xelb-error-alist "(error-number . error-class) alist."))
+ (princ "\n"))
+ (when xelb-event-alist
+ (pp
+ `(defconst ,(intern (concat xelb-prefix "event-number-class-alist"))
+ ',xelb-event-alist "(event-number . event-class) alist."))
+ (princ "\n"))
+ (when xelb-xge-alist
+ (pp
+ `(defconst ,(intern (concat xelb-prefix "xge-number-class-alist"))
+ ',xelb-xge-alist "(xge-number . event-class) alist."))
+ (princ "\n"))
+ ;; Print footer
+ (princ (format "\
+
+
+(provide 'xcb-%s)
+
+;;; xcb-%s.el ends here
+" header header)))))
+
+;;;; XCB: top-level elements
+
+(defun xelb-parse-top-level-element (node)
+ "Parse a top-level node NODE."
+ (setq xelb-pad-count -1)
+ (pcase (xelb-node-name node)
+ (`import (xelb-parse-import node))
+ (`struct (xelb-parse-struct node))
+ (`union (xelb-parse-union node))
+ ((or `xidtype `xidunion)
+ (xelb-parse-xidtype node)) ;they are basically the same
+ (`enum (xelb-parse-enum node))
+ (`typedef (xelb-parse-typedef node))
+ (`request (xelb-parse-request node))
+ (`event (xelb-parse-event node))
+ (`error (xelb-parse-error node))
+ (`eventcopy (xelb-parse-eventcopy node))
+ (`errorcopy (xelb-parse-errorcopy node))
+ (`eventstruct (xelb-parse-eventstruct node))
+ ((or `comment `doc)) ;ignored
+ (x (error "Unsupported top-level element: <%s>" x))))
+
+(defun xelb-parse-import (node)
+ "Parse <import>."
+ (let* ((name (xelb-node-subnode node))
+ (header (intern (concat "xcb-" name))))
+ (require header)
+ (push (concat "xcb:" name ":") xelb-imports)
+ `((require ',header))))
+
+(defun xelb-parse-struct (node)
+ "Parse <struct>."
+ (let ((name (intern (concat xelb-prefix (xelb-node-attr node 'name))))
+ (contents (xelb-node-subnodes node t)))
+ `((defclass ,name (xcb:-struct)
+ ,(apply #'nconc (mapcar #'xelb-parse-structure-content contents))))))
+
+(defun xelb-parse-union (node)
+ "Parse <union>."
+ (let ((name (intern (concat xelb-prefix (xelb-node-attr node 'name))))
+ (contents (xelb-node-subnodes node)))
+ `((defclass ,name (xcb:-union)
+ ,(apply #'nconc
+ `((~size :initform
+ ,(apply #'max (mapcar #'xelb-node-size contents))))
+ (mapcar #'xelb-parse-structure-content contents))))))
+
+(defun xelb-parse-xidtype (node)
+ "Parse <xidtype>."
+ (let ((name (intern (concat xelb-prefix (xelb-node-attr node 'name)))))
+ `((xcb:deftypealias ',name 'xcb:-u4))))
+
+(defun xelb-parse-enum (node)
+ "Parse <enum>."
+ (let ((name-prefix (concat xelb-prefix (xelb-node-attr node 'name) ":"))
+ (items (xelb-node-subnodes node))
+ (value 0))
+ (delq nil ;remove nil's produced by tags like <doc>
+ (mapcar (lambda (i)
+ (when (eq (xelb-node-name i) 'item)
+ ;; Only handle <item> tags
+ (let* ((name (xelb-node-attr i 'name))
+ (name (intern (concat name-prefix name)))
+ (expression (xelb-node-subnode i)))
+ (if expression
+ (setq value (xelb-parse-expression expression))
+ (cl-incf value))
+ ;; Omit the rare enums that do not fit in a fixnum in
+ ;; 32-bit Emacs, so that the resulting .el and .elc
+ ;; files are portable to 32-bit Emacs. Admittedly
+ ;; this is a kludge.
+ (unless (and (integerp value)
+ (not (<= -536870912 value 536870911)))
+ `(defconst ,name ,value)))))
+ items))))
+
+(defun xelb-parse-typedef (node)
+ "Parse <typedef>."
+ (let* ((oldname (xelb-node-attr node 'oldname))
+ (oldname (xelb-resolve-type oldname))
+ (newname (intern (concat xelb-prefix
+ (xelb-node-attr node 'newname)))))
+ `((xcb:deftypealias ',newname ',oldname))))
+
+(defun xelb-parse-request (node)
+ "Parse <request>.
+
+The `combine-adjacent' attribute is simply ignored."
+ (let* ((name (intern (concat xelb-prefix (xelb-node-attr node 'name))))
+ (opcode (string-to-number (xelb-node-attr node 'opcode)))
+ (contents `((~opcode :initform ,opcode :type xcb:-u1)))
+ (subnodes (xelb-node-subnodes node t))
+ expressions
+ result reply-name reply-contents)
+ ;; Fill `xelb-request-fields'.
+ (setq xelb-request-fields nil)
+ (dolist (i subnodes)
+ (unless (eq (xelb-node-name i) 'reply)
+ (let ((name (xelb-node-attr i 'name)))
+ (when name
+ (push (intern (xelb-escape-name name)) xelb-request-fields)))))
+ (dolist (i subnodes)
+ (if (not (eq (xelb-node-name i) 'reply))
+ (progn
+ (setq result (xelb-parse-structure-content i))
+ (if (eq 'exprfield (xelb-node-name i))
+ ;; Split into field and expression
+ (setq contents (nconc contents (list (car result)))
+ expressions (nconc expressions (list (cadr result))))
+ (setq contents (nconc contents result))))
+ ;; Parse <reply>
+ (setq xelb-pad-count -1) ;reset padding counter
+ (setq xelb-request-fields nil) ;Clear `xelb-request-fields'.
+ (setq reply-name
+ (intern (concat xelb-prefix (xelb-node-attr node 'name)
+ "~reply")))
+ (setq reply-contents (xelb-node-subnodes i t))
+ (setq reply-contents
+ (apply #'nconc
+ (mapcar #'xelb-parse-structure-content reply-contents)))))
+ (setq xelb-request-fields nil) ;Clear `xelb-request-fields'.
+ (delq nil contents)
+ (delq nil
+ `((defclass ,name (xcb:-request) ,contents)
+ ;; The optional expressions
+ ,(when expressions
+ `(cl-defmethod xcb:marshal ((obj ,name)) nil
+ ,@expressions
+ (cl-call-next-method obj)))
+ ;; The optional reply body
+ ,(when reply-name
+ (delq nil reply-contents)
+ ;; Insert slots for sequence number and reply length.
+ (setcdr reply-contents (append '((~sequence :type xcb:CARD16)
+ (length :type xcb:CARD32))
+ (cdr reply-contents)))
+ `(defclass ,reply-name (xcb:-reply) ,reply-contents))))))
+
+(defun xelb-parse-event (node)
+ "Parse <event>."
+ (let ((name (intern (concat xelb-prefix (xelb-node-attr node 'name))))
+ (event-number (string-to-number (xelb-node-attr node 'number)))
+ (no-sequence-number (xelb-node-attr node 'no-sequence-number))
+ (xge (xelb-node-attr node 'xge))
+ (contents (xelb-node-subnodes node t))
+ xge-extension)
+ (setq xge-extension (and xge (not (eq name 'xcb:GeGeneric))))
+ (setq contents
+ (apply #'nconc (mapcar #'xelb-parse-structure-content contents)))
+ (unless (or no-sequence-number xge)
+ (setcdr contents (append '((~sequence :type xcb:CARD16))
+ (cdr contents))))
+ ;; Add the event code.
+ (unless (and xge (not xge-extension))
+ (push `(,(if xge '~evtype '~code) :initform ,event-number) contents))
+ (if xge-extension
+ (setq xelb-xge-alist
+ (nconc xelb-xge-alist `((,event-number . ,name))))
+ (setq xelb-event-alist
+ (nconc xelb-event-alist `((,event-number . ,name)))))
+ `((defclass ,name (,(if xge 'xcb:-generic-event 'xcb:-event)) ,contents))))
+
+(defun xelb-parse-error (node)
+ "Parse <error>."
+ (let ((name (intern (concat xelb-prefix (xelb-node-attr node 'name))))
+ (error-number (string-to-number (xelb-node-attr node 'number)))
+ (contents (xelb-node-subnodes node t)))
+ (setq xelb-error-alist (nconc xelb-error-alist `((,error-number . ,name))))
+ `((defclass ,name (xcb:-error)
+ ,(append
+ ;; The error code.
+ `((~code :initform ,error-number))
+ ;; The contents.
+ (apply #'nconc (mapcar #'xelb-parse-structure-content contents)))))))
+
+(defun xelb-parse-eventcopy (node)
+ "Parse <eventcopy>."
+ (let* ((name (intern (concat xelb-prefix (xelb-node-attr node 'name))))
+ (refname (xelb-node-attr node 'ref))
+ (refname (xelb-resolve-type refname))
+ (xge (child-of-class-p refname 'xcb:-generic-event))
+ (event-number (string-to-number (xelb-node-attr node 'number))))
+ (if xge
+ (setq xelb-xge-alist
+ (nconc xelb-xge-alist `((,event-number . ,name))))
+ (setq xelb-event-alist
+ (nconc xelb-event-alist `((,event-number . ,name)))))
+ `((defclass ,name (,refname) ;Shadow the method of ref.
+ ((,(if xge '~evtype '~code) :initform ,event-number))))))
+
+(defun xelb-parse-errorcopy (node)
+ "Parse <errorcopy>."
+ (let* ((name (intern (concat xelb-prefix (xelb-node-attr node 'name))))
+ (refname (xelb-node-attr node 'ref))
+ (refname (xelb-resolve-type refname))
+ (error-number (string-to-number (xelb-node-attr node 'number))))
+ (setq xelb-error-alist (nconc xelb-error-alist `((,error-number . ,name))))
+ `((defclass ,name (xcb:-error ,refname) ;Shadow the method of ref
+ ((~code :initform ,error-number))))))
+
+(defun xelb-parse-eventstruct (node)
+ "Parse <eventstruct>."
+ (let ((name (intern (concat xelb-prefix (xelb-node-attr node 'name)))))
+ ;; Only conventional events are supported (and we don't check opcode).
+ `((defclass ,name (xcb:-event) nil))))
+
+;;;; XCB: structure contents
+
+(defun xelb-parse-structure-content (node)
+ "Parse a structure content node NODE."
+ (pcase (xelb-node-name node)
+ (`pad (xelb-parse-pad node))
+ (`required_start_align (xelb-parse-required_start_align node))
+ (`field (xelb-parse-field node))
+ (`length (xelb-parse-length node))
+ (`fd (xelb-parse-fd node))
+ (`list (xelb-parse-list node))
+ (`exprfield (xelb-parse-exprfield node))
+ (`switch (xelb-parse-switch node))
+ ((or `comment `doc)) ;simply ignored
+ (x (error "Unsupported structure content: <%s>" x))))
+
+;; The car of the result shall be renamed to prevent duplication of slot names
+(defun xelb-parse-pad (node)
+ "Parse <pad>."
+ (let ((bytes (xelb-node-attr node 'bytes))
+ (align (xelb-node-attr node 'align)))
+ (if bytes
+ `((,(xelb-generate-pad-name)
+ :initform ,(string-to-number bytes) :type xcb:-pad))
+ (if align
+ `((,(xelb-generate-pad-name)
+ :initform ,(string-to-number align) :type xcb:-pad-align))
+ (error "Invalid <pad> field")))))
+
+(defun xelb-parse-required_start_align (node)
+ "Parse <required_start_align>."
+ (let ((align (xelb-node-attr node 'align))
+ (offset (xelb-node-attr node 'offset)))
+ `((,(xelb-generate-pad-name)
+ :initform ,(if offset
+ (vector (string-to-number align)
+ (string-to-number offset))
+ (string-to-number align))
+ :type xcb:-pad-align))))
+
+(defun xelb-parse-field (node)
+ "Parse <field>."
+ (let* ((name (intern (xelb-node-attr-escape node 'name)))
+ (type (xelb-node-type node)))
+ `((,name :initarg ,(intern (concat ":" (symbol-name name))) :type ,type))))
+
+(defun xelb-parse-length (node)
+ "Parse <length>."
+ (let ((length (xelb-parse-expression (xelb-node-subnode node))))
+ `((~size :initform ',length))))
+
+(defun xelb-parse-fd (node)
+ "Parse <fd>."
+ (let ((name (intern (xelb-node-attr-escape node 'name))))
+ `((,name :type xcb:fd))))
+
+(defun xelb-parse-list (node)
+ "Parse <list>."
+ (let* ((name (intern (xelb-node-attr-escape node 'name)))
+ (name-alt (intern (concat (xelb-node-attr-escape node 'name) "~")))
+ (type (xelb-node-type node))
+ (size (xelb-parse-expression (xelb-node-subnode node))))
+ `((,name-alt :initform '(name ,name type ,type size ,size)
+ :type xcb:-list)
+ (,name :initarg ,(intern (concat ":" (symbol-name name)))
+ :type xcb:-ignore))))
+
+;; The car of result is the field declaration, and the cadr is the expression
+;; to be evaluated.
+(defun xelb-parse-exprfield (node)
+ "Parse <exprfield>."
+ (let* ((name (intern (xelb-node-attr-escape node 'name)))
+ (type (xelb-node-type node))
+ (value (xelb-parse-expression (xelb-node-subnode node))))
+ `((,name :type ,type)
+ (setf (slot-value obj ',name) ,value))))
+
+;; The only difference between <bitcase> and <case> is whether the `condition'
+;; is a list
+;; The name attribute of <bitcase> and <case> seems not useful here.
+(defun xelb-parse-switch (node)
+ "Parse <switch>."
+ (let ((name (intern (xelb-node-attr-escape node 'name)))
+ (expression (xelb-parse-expression (car (xelb-node-subnodes node))))
+ ;; <case> and <bitcase> only
+ (cases (cl-remove-if-not (lambda (i)
+ (memq (xelb-node-name i) '(case bitcase)))
+ (xelb-node-subnodes node)))
+ fields)
+ ;; Avoid duplicated slot names by appending "*" if necessary
+ (let (names name)
+ (dolist (case cases)
+ (pcase (xelb-node-name case)
+ ((or `bitcase `case)
+ (dolist (field (xelb-node-subnodes case))
+ (pcase (xelb-node-name field)
+ ((or `enumref `pad `doc `comment `required_start_align))
+ (_
+ (setq name (xelb-node-attr field 'name))
+ (when (member name names)
+ (while (member name names)
+ (setq name (concat name "*")))
+ (setcdr (assoc 'name (cadr field)) name))
+ (cl-pushnew name names :test #'equal))))))))
+ (setq cases
+ (mapcar (lambda (i)
+ (let ((case-name (xelb-node-name i))
+ condition name-list tmp)
+ (when (or (eq case-name 'bitcase) (eq case-name 'case))
+ (dolist (j (xelb-node-subnodes i t))
+ (pcase (xelb-node-name j)
+ (`enumref
+ (setq condition
+ (nconc condition
+ (list (xelb-parse-enumref j)))))
+ (_
+ (setq tmp (xelb-parse-structure-content j))
+ (setq fields (nconc fields tmp))
+ (setq name-list
+ (nconc name-list (list (caar tmp)))))))
+ (when (eq case-name 'bitcase)
+ (setq condition (if (= 1 (length condition))
+ ;; Flatten 1-element list.
+ (car condition)
+ (if (cl-every #'integerp condition)
+ (apply #'logior condition)
+ `(logior ,@condition))))))
+ `(,condition ,@name-list)))
+ cases))
+ `((,name :initform '(expression ,expression cases ,cases)
+ :type xcb:-switch)
+ ,@fields)))
+
+;;;; XCB: expressions
+
+(defun xelb-parse-expression (node)
+ "Parse an expression node NODE."
+ (when node
+ (pcase (xelb-node-name node)
+ (`op (xelb-parse-op node))
+ (`fieldref (xelb-parse-fieldref node))
+ (`paramref (xelb-parse-paramref node))
+ (`value (xelb-parse-value node))
+ (`bit (xelb-parse-bit node))
+ (`enumref (xelb-parse-enumref node))
+ (`unop (xelb-parse-unop node))
+ (`sumof (xelb-parse-sumof node))
+ (`popcount (xelb-parse-popcount node))
+ (`listelement-ref (xelb-parse-listelement-ref node))
+ ((or `comment `doc)) ;simply ignored
+ (x (error "Unsupported expression: <%s>" x)))))
+
+(defun xelb-parse-op (node)
+ "Parse <op>."
+ (let* ((subnodes (xelb-node-subnodes node))
+ (x (xelb-parse-expression (car subnodes)))
+ (y (xelb-parse-expression (cadr subnodes))))
+ (pcase (xelb-node-attr node 'op)
+ ("+" `(+ ,x ,y))
+ ("-" `(- ,x ,y))
+ ("*" `(* ,x ,y))
+ ("/" `(/ ,x ,y))
+ ("&" `(logand ,x ,y))
+ ("<<" `(ash ,x ,y))
+ (x (error "Unsupported operator: `%s'" x)))))
+
+(defun xelb-parse-fieldref (node)
+ "Parse <fieldref>."
+ (let ((name (intern (xelb-escape-name (xelb-node-subnode node)))))
+ (if (or (not xelb-request-fields) ;Probably not a request.
+ (memq name xelb-request-fields)
+ (not (string-suffix-p "-len" (symbol-name name))))
+ `(xcb:-fieldref ',name)
+ `(length
+ (xcb:-fieldref ',(intern (substring (symbol-name name) 0 -4)))))))
+
+(defun xelb-parse-paramref (node)
+ "Parse <paramref>."
+ `(xcb:-paramref ',(intern (xelb-escape-name (xelb-node-subnode node)))))
+
+(defun xelb-parse-value (node)
+ "Parse <value>."
+ (string-to-number
+ (replace-regexp-in-string "^0x" "#x" (xelb-node-subnode node))))
+
+(defun xelb-parse-bit (node)
+ "Parse <bit>."
+ (let ((bit (string-to-number (xelb-node-subnode node))))
+ (cl-assert (<= 0 bit 31))
+ (ash 1 bit)))
+
+(defun xelb-parse-enumref (node)
+ "Parse <enumref>."
+ (let ((name (concat (xelb-node-attr node 'ref) ":"
+ (xelb-node-subnode node))))
+ (symbol-value (xelb-resolve-type name))))
+
+(defun xelb-parse-unop (node)
+ "Parse <unop>."
+ (cl-assert (string= "~" (xelb-node-attr node 'op)))
+ `(lognot ,(xelb-parse-expression (xelb-node-subnode node))))
+
+(defun xelb-parse-sumof (node)
+ "Parse <sumof>."
+ (let* ((ref (intern (xelb-node-attr-escape node 'ref)))
+ (expression (xelb-node-subnode node))
+ (list-data `(slot-value obj ',ref)))
+ (if (not expression)
+ `(apply #'+ ,list-data)
+ (setq expression (xelb-parse-expression expression))
+ `(apply #'+ (mapcar (lambda (i)
+ (eval ',expression (list (nconc '(obj) i))))
+ ,list-data)))))
+
+(defun xelb-parse-popcount (node)
+ "Parse <popcount>."
+ (let ((expression (xelb-parse-expression (xelb-node-subnode node))))
+ `(logcount ,expression)))
+
+(defun xelb-parse-listelement-ref (_node)
+ "Parse <listelement-ref>."
+ 'obj) ;a list element is internally named 'obj'
+
+;;;; The entry
+
+(setq debug-on-error t)
+(setq edebug-all-forms t)
+
+(if (not argv)
+ (error "Usage: xelb-gen <protocol.xml> [additional_load_paths]")
+ (add-to-list 'load-path default-directory)
+ (dolist (i (cdr argv))
+ (add-to-list 'load-path i))
+ (require 'xcb-types)
+ (xelb-parse (car argv)))
+
+;;; xelb-gen ends here
diff --git a/elpa/xelb-0.20/xelb-pkg.el b/elpa/xelb-0.20/xelb-pkg.el
new file mode 100644
index 0000000..b66d835
--- /dev/null
+++ b/elpa/xelb-0.20/xelb-pkg.el
@@ -0,0 +1,2 @@
+;; Generated package description from xelb.el -*- no-byte-compile: t -*-
+(define-package "xelb" "0.20" "X protocol Emacs Lisp Binding" '((emacs "27.1") (compat "29.1")) :commit "bdf3a69214c70611fbce71942598c85c4fe3d6b7" :authors '(("Chris Feng" . "chris.w.feng@gmail.com")) :maintainer '(("Adrián Medraño Calvo" . "adrian@medranocalvo.com") ("Steven Allen" . "steven@stebalien.com") ("Daniel Mendler" . "mail@daniel-mendler.de")) :keywords '("unix") :url "https://github.com/emacs-exwm/xelb")
diff --git a/elpa/xelb-0.20/xelb-test.el b/elpa/xelb-0.20/xelb-test.el
new file mode 100644
index 0000000..ed7e6f8
--- /dev/null
+++ b/elpa/xelb-0.20/xelb-test.el
@@ -0,0 +1,96 @@
+;;; xelb-test.el --- Unit tests for XELB -*- lexical-binding: t -*-
+;; Copyright (C) 2024 Free Software Foundation, Inc.
+
+;; Author: Steven Allen <steven@stebalien.com>
+
+;; 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 module contains unit tests for testing XELB.
+
+;;; Code:
+
+(require 'ert)
+(require 'xcb-types)
+
+;; https://en.wikipedia.org/wiki/Single-precision_floating-point_format#Notable_single-precision_cases
+(defconst xelb-test-binary32-cases
+ '((#x00000001 . 1.401298464324817e-45)
+ (#x007fffff . 1.1754942106924411e-38)
+ (#x00800000 . 1.1754943508222875e-38)
+ (#x7f7fffff . 3.4028234663852886e38)
+ (#x3f7fffff . 0.999999940395355225)
+ (#x3f800000 . 1.0)
+ (#x3f800001 . 1.00000011920928955)
+ (#xc0000000 . -2.0)
+ (#x00000000 . 0.0)
+ (#x80000000 . -0.0)
+ (#x7f800000 . 1e+INF)
+ (#xff800000 . -1e+INF)
+ (#x40490fdb . 3.14159274101257324)
+ (#x3eaaaaab . 0.333333343267440796)))
+
+;; https://en.wikipedia.org/wiki/Double-precision_floating-point_format#Double-precision_examples
+(defconst xelb-test-binary64-cases
+ `((#x3ff0000000000000 . 1.0)
+ (#x3ff0000000000001 . 1.0000000000000002)
+ (#x3ff0000000000002 . 1.0000000000000004)
+ (#x4000000000000000 . 2.0)
+ (#xc000000000000000 . -2.0)
+ (#x4008000000000000 . 3.0)
+ (#x4010000000000000 . 4.0)
+ (#x4014000000000000 . 5.0)
+ (#x4018000000000000 . 6.0)
+ (#x4037000000000000 . 23.0)
+ (#x3f88000000000000 . 0.01171875)
+ (#x0000000000000001 . 4.9406564584124654e-324)
+ (#x000fffffffffffff . 2.2250738585072009e-308)
+ (#x0010000000000000 . 2.2250738585072014e-308)
+ (#x7fefffffffffffff . 1.7976931348623157e308)
+ (#x0000000000000000 . +0.0)
+ (#x8000000000000000 . -0.0)
+ (#x7ff0000000000000 . +1e+INF)
+ (#xfff0000000000000 . -1e+INF)
+ (#x3fd5555555555555 . ,(/ 1.0 3.0))
+ (#x400921fb54442d18 . ,float-pi)))
+
+(defun xelb-test--test-conversion (a-to-b b-to-a cases)
+ "Test the bidirectional conversion functions A-TO-B and B-TO-A against CASES.
+CASES is an alist of (A . B) pairs."
+ (pcase-dolist (`(,a . ,b) cases)
+ (let* ((act-a (funcall b-to-a b))
+ (act-b (funcall a-to-b a))
+ (round-trip-a (funcall b-to-a act-b))
+ (round-trip-b (funcall a-to-b act-a)))
+ (should (= b act-b round-trip-b))
+ (should (= a act-a round-trip-a)))))
+
+(ert-deftest xelb-test-binary32 ()
+ (xelb-test--test-conversion
+ #'xcb:-binary32-to-f32
+ #'xcb:-f32-to-binary32
+ xelb-test-binary32-cases))
+
+(ert-deftest xelb-test-binary64 ()
+ (xelb-test--test-conversion
+ #'xcb:-binary64-to-f64
+ #'xcb:-f64-to-binary64
+ xelb-test-binary64-cases))
+
+(provide 'xelb-test)
+
+;;; xelb-test.el ends here
diff --git a/elpa/xelb-0.20/xelb-test.elc b/elpa/xelb-0.20/xelb-test.elc
new file mode 100644
index 0000000..aa4e8cc
--- /dev/null
+++ b/elpa/xelb-0.20/xelb-test.elc
Binary files differ
diff --git a/elpa/xelb-0.20/xelb.el b/elpa/xelb-0.20/xelb.el
new file mode 100644
index 0000000..c3ab170
--- /dev/null
+++ b/elpa/xelb-0.20/xelb.el
@@ -0,0 +1,70 @@
+;;; xelb.el --- X protocol Emacs Lisp Binding -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2024 Free Software Foundation, Inc.
+
+;; Author: Chris Feng <chris.w.feng@gmail.com>
+;; Maintainer: Adrián Medraño Calvo <adrian@medranocalvo.com>, Steven Allen <steven@stebalien.com>, Daniel Mendler <mail@daniel-mendler.de>
+;; Version: 0.20
+;; Package-Requires: ((emacs "27.1") (compat "29.1"))
+;; Keywords: unix
+;; URL: https://github.com/emacs-exwm/xelb
+
+;; 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:
+
+;; Overview
+;; --------
+;; XELB (X protocol Emacs Lisp Binding) is a pure Elisp implementation of X11
+;; protocol based on the XML description files from XCB project. It features
+;; an object-oriented API and permits a certain degree of concurrency. It
+;; should enable you to implement some low-level X11 applications.
+
+;; How it works
+;; ------------
+;; As is well known, X11 is a network-transparent protocol. All its messages,
+;; including requests, replies, events, errors, etc are transported over
+;; network. Considering that Emacs is powerful enough to do network
+;; communication, it is also possible to use Emacs to send / receive those X11
+;; messages. Here we fully exploit the asynchronous feature of network
+;; connections in Emacs, making XELB concurrent in a sense.
+
+;; X11 protocol is somewhat complicated, especially when extension protocols
+;; are also concerned. Fortunately, XCB project has managed to describe these
+;; protocols as XML files, which are language-neutral and can be used to
+;; generate language-specific bindings. In XELB, X messages are represented as
+;; 'classes', and their 'methodes' are provided to translate them to / from raw
+;; byte arrays conveniently.
+
+;; Usage
+;; -----
+;; Interfaces are mainly defined in 'xcb.el'. Please refer to that file on how
+;; to use them. Most of other files are either X11 core / extension protocol
+;; libraries (e.g. xcb-randr.el) or utility libraries (e.g. xcb-keysyms.el).
+;; Please check the corresponding files for more details.
+
+;;; Code:
+
+(require 'xcb)
+
+;; DO NOT load this library; load 'xcb.el' instead.
+;; This dummy file is created as a placeholder as it is required by GNU ELPA.
+
+
+
+(provide 'xelb)
+
+;;; xelb.el ends here
diff --git a/elpa/xelb-0.20/xelb.elc b/elpa/xelb-0.20/xelb.elc
new file mode 100644
index 0000000..ba62603
--- /dev/null
+++ b/elpa/xelb-0.20/xelb.elc
Binary files differ