added more rust configurations
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
||||
projectile-bookmarks.eld
|
||||
*.dat
|
||||
*~
|
||||
|
||||
@@ -774,7 +774,7 @@
|
||||
(scalariform . [(20190114 215) ((s (1 12 0)) (f (0 20 0))) "Format Scala code with scalariform." single ((:commit . "478a15ccb4f825aba73262bccd3e61ce7017f64b") (:keywords "processes" "scala" "scalariform") (:authors ("zwild" . "judezhao@outlook.com")) (:maintainer "zwild" . "judezhao@outlook.com") (:url . "https://github.com/zwild/scalariform"))])
|
||||
(scala-mode . [(20190929 1522) nil "Major mode for editing Scala" tar ((:commit . "44772cbf1e1ade52bc5066555ff0aed68569aaec") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-scala-mode"))])
|
||||
(scad-preview . [(20160206 1336) ((scad-mode (91 0))) "Preview SCAD models in real-time within Emacs" single ((:commit . "fee011589671cc8f1296cb6aa81553e5bb699819") (:authors ("zk_phi")) (:maintainer "zk_phi") (:url . "http://hins11.yu-yake.com/"))])
|
||||
(scad-mode . [(20190413 1246) nil "A major mode for editing OpenSCAD code" single ((:commit . "0fd84dbc4634f3be1b904fd31b1b49b05137c923") (:keywords "languages") (:authors ("Len Trigg, Łukasz Stelmach")) (:maintainer "Len Trigg" . "lenbok@gmail.com") (:url . "https://raw.github.com/openscad/openscad/master/contrib/scad-mode.el"))])
|
||||
(scad-mode . [(20190413 1246) nil "A major mode for editing OpenSCAD code" single ((:commit . "8c5970cd385b498affc5bdbdc6b364eb8196c707") (:keywords "languages") (:authors ("Len Trigg, Łukasz Stelmach")) (:maintainer "Len Trigg" . "lenbok@gmail.com") (:url . "https://raw.github.com/openscad/openscad/master/contrib/scad-mode.el"))])
|
||||
(sbt-mode . [(20190929 1531) ((emacs (24 4))) "Interactive support for sbt projects" tar ((:commit . "5d2edadff23fe23e911379d6c2141d55b23e7254") (:keywords "languages") (:url . "https://github.com/hvesalai/emacs-sbt-mode"))])
|
||||
(sayid . [(20190919 654) ((cider (0 21 0))) "sayid nREPL middleware client" single ((:commit . "277404a6bb0a979e195df5886fc143bb1d1f1e8c") (:authors ("Bill Piel" . "bill@billpiel.com")) (:maintainer "Bill Piel" . "bill@billpiel.com") (:url . "https://github.com/clojure-emacs/sayid"))])
|
||||
(say-what-im-doing . [(20160706 1931) nil "dictate what you're doing with text to speech" single ((:commit . "5b2ce6783b02805bcac1107a149bfba3852cd9d5") (:keywords "text to speech" "dumb" "funny") (:authors ("Benaiah Mischenko")) (:maintainer "Benaiah Mischenko") (:url . "http://github.com/benaiah/say-what-im-doing"))])
|
||||
@@ -1177,7 +1177,7 @@
|
||||
(php-scratch . [(20161103 2217) ((emacs (24 3)) (s (1 11 0)) (php-mode (1 17 0))) "A scratch buffer to interactively evaluate php code" single ((:commit . "3aa66d1d53b84b779374edff7a7e6b5f2cd7575d") (:authors ("Tijs Mallaerts" . "tijs.mallaerts@gmail.com")) (:maintainer "Tijs Mallaerts" . "tijs.mallaerts@gmail.com"))])
|
||||
(php-runtime . [(20181212 1825) ((emacs (25)) (cl-lib (0 5)) (f (0 20)) (s (1 7))) "Language binding bridge to PHP" single ((:commit . "017e0e70f07d6b25e37d5c5f4d271a914b677631") (:keywords "processes" "php") (:authors ("USAMI Kenta" . "tadsan@zonu.me")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/php-runtime.el"))])
|
||||
(php-refactor-mode . [(20171124 635) nil "Minor mode to quickly and safely perform common refactorings" single ((:commit . "7a794b0618df2882b1bd586fdd698dba0bc5130d") (:keywords "php" "refactor") (:authors ("Matthew M. Keeler" . "keelerm84@gmail.com")) (:maintainer "Matthew M. Keeler" . "keelerm84@gmail.com") (:url . "https://github.com/keelerm84/php-refactor-mode.el"))])
|
||||
(php-mode . [(20190930 111) ((emacs (24 3))) "Major mode for editing PHP code" tar ((:commit . "5ba2a16e1751446502652021942f59f2e36aea41") (:keywords "languages" "php") (:authors ("Eric James Michael Ritz")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/php-mode"))])
|
||||
(php-mode . [(20191027 1534) ((emacs (24 3))) "Major mode for editing PHP code" tar ((:commit . "429c612d904819e6f85938a95b5fc605c7f0a00c") (:keywords "languages" "php") (:authors ("Eric James Michael Ritz")) (:maintainer "USAMI Kenta" . "tadsan@zonu.me") (:url . "https://github.com/emacs-php/php-mode"))])
|
||||
(php-eldoc . [(20140202 1941) nil "eldoc backend for php" tar ((:commit . "df05064146b884d9081e10657e32dc480f070cfe") (:authors ("sabof")) (:maintainer "sabof") (:url . "https://github.com/sabof/php-eldoc"))])
|
||||
(php-cs-fixer . [(20190207 1126) ((cl-lib (0 5))) "php-cs-fixer wrapper." single ((:commit . "6540006710daf2b2d47576968ea826a83a40a6bf") (:keywords "languages" "php") (:authors ("Philippe Ivaldi for OVYA")) (:maintainer "Philippe Ivaldi for OVYA") (:url . "https://github.com/OVYA/php-cs-fixer"))])
|
||||
(php-boris-minor-mode . [(20140209 1835) ((php-boris (0 0 1)) (highlight (0))) "a minor mode to evaluate PHP code in the Boris repl" single ((:commit . "c70e176dd6545f2d42ca3427e87b469635616d8a") (:keywords "php" "repl" "eval") (:authors ("steckerhalter")) (:maintainer "steckerhalter") (:url . "https://github.com/steckerhalter/php-boris-minor-mode"))])
|
||||
@@ -1284,8 +1284,8 @@
|
||||
(packed . [(20180318 1729) ((emacs (24 3))) "package manager agnostic Emacs Lisp package utilities" single ((:commit . "f350cc446c65b85bcc213265cd6dcadee1568762") (:keywords "compile" "convenience" "lisp" "package" "library") (:authors ("Jonas Bernoulli" . "jonas@bernoul.li")) (:maintainer "Jonas Bernoulli" . "jonas@bernoul.li") (:url . "https://github.com/emacscollective/packed"))])
|
||||
(package-utils . [(20180514 1415) ((restart-emacs (0 1 1))) "Extensions for package.el" single ((:commit . "5621b95c56b55499f0463fd8b29501da25d861bd") (:keywords "package" "convenience") (:authors ("Philippe Vaucher" . "philippe.vaucher@gmail.com")) (:maintainer "Philippe Vaucher" . "philippe.vaucher@gmail.com") (:url . "https://github.com/Silex/package-utils"))])
|
||||
(package-safe-delete . [(20150116 1607) ((emacs (24)) (epl (0 7 -4))) "Safely delete package.el packages" single ((:commit . "138171e4fc03c0ef05a8260cbb5cd2e114c1c194") (:authors ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Fanael Linithien" . "fanael4@gmail.com") (:url . "https://github.com/Fanael/package-safe-delete"))])
|
||||
(package-lint-flymake . [(20181117 856) ((emacs (26)) (package-lint (0 5))) "A package-lint Flymake backend" single ((:commit . "eb1867b5ad68b3ca762dad33cb1e30eed1cc7252") (:url . "https://github.com/purcell/package-lint"))])
|
||||
(package-lint . [(20191027 20) ((cl-lib (0 5)) (emacs (24 1)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:commit . "eb1867b5ad68b3ca762dad33cb1e30eed1cc7252") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/package-lint"))])
|
||||
(package-lint-flymake . [(20181117 856) ((emacs (26)) (package-lint (0 5))) "A package-lint Flymake backend" single ((:commit . "bd22c75a15eab33dfdaa652d33c0a4adc489b3df") (:url . "https://github.com/purcell/package-lint"))])
|
||||
(package-lint . [(20191027 20) ((cl-lib (0 5)) (emacs (24 1)) (let-alist (1 0 6))) "A linting library for elisp package authors" tar ((:commit . "bd22c75a15eab33dfdaa652d33c0a4adc489b3df") (:keywords "lisp") (:authors ("Steve Purcell" . "steve@sanityinc.com") ("Fanael Linithien" . "fanael4@gmail.com")) (:maintainer "Steve Purcell" . "steve@sanityinc.com") (:url . "https://github.com/purcell/package-lint"))])
|
||||
(package-filter . [(20161122 719) nil "package archive whitelist and blacklist" single ((:commit . "bc73b41aea1d65ca44ef1593ca13126df9bbb39e") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net") (:url . "https://github.com/milkypostman/package-filter"))])
|
||||
(package-build . [(20191010 616) ((cl-lib (0 5))) "Tools for assembling a package archive" tar ((:commit . "f761c2ffeed0daba9c17ac7571c7b979b6ceed64") (:keywords "tools") (:authors ("Donald Ephraim Curtis" . "dcurtis@milkbox.net")) (:maintainer "Donald Ephraim Curtis" . "dcurtis@milkbox.net"))])
|
||||
(package+ . [(20190702 253) ((emacs (24 3))) "Extensions for the package library." single ((:commit . "2a99b8e27be1702d94ce077ecd75e1089fa18a32") (:keywords "extensions" "tools") (:authors ("Ryan Davis" . "ryand-ruby@zenspider.com")) (:maintainer "Ryan Davis" . "ryand-ruby@zenspider.com") (:url . "https://github.com/zenspider/package"))])
|
||||
@@ -1926,7 +1926,7 @@
|
||||
(lsp-pyre . [(20190406 335) ((lsp-mode (6 0))) "lsp-mode client for python using pyre" single ((:commit . "e177b8f5efd1a955b5753aeb5d1894e6d21be35a") (:authors ("John Allen" . "oss@porcnick.com")) (:maintainer "John Allen" . "oss@porcnick.com") (:url . "https://github.com/jra3/lsp-pyre"))])
|
||||
(lsp-p4 . [(20190127 1049) ((lsp-mode (3 0))) "P4 support for lsp-mode" tar ((:commit . "54dd19d88cd561061ac3103dc452d6854e5899fa") (:keywords "lsp" "p4") (:authors ("Dmitri Makarov")) (:maintainer "Dmitri Makarov") (:url . "https://github.com/dmakarov/p4ls"))])
|
||||
(lsp-origami . [(20190331 1723) ((origami (1 0)) (lsp-mode (20190326 522))) "origami.el support for lsp-mode" single ((:commit . "c7653602a2f2396b1a42d6053fd2be55fce8e0a2") (:keywords "languages" "lsp-mode") (:authors ("Vibhav Pant")) (:maintainer "Vibhav Pant") (:url . "https://github.com/emacs-lsp/lsp-origami"))])
|
||||
(lsp-mode . [(20191026 1912) ((emacs (25 1)) (dash (2 14 1)) (dash-functional (2 14 1)) (f (0 20 0)) (ht (2 0)) (spinner (1 7 3)) (markdown-mode (2 3))) "LSP mode" tar ((:commit . "366307e751ce71cc72216d4a9a0285270cf15515") (:keywords "languages") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:url . "https://github.com/emacs-lsp/lsp-mode"))])
|
||||
(lsp-mode . [(20191027 1345) ((emacs (25 1)) (dash (2 14 1)) (dash-functional (2 14 1)) (f (0 20 0)) (ht (2 0)) (spinner (1 7 3)) (markdown-mode (2 3))) "LSP mode" tar ((:commit . "1b4e25418c7d321808f33e132a4785c1ee075a7a") (:keywords "languages") (:authors ("Vibhav Pant, Fangrui Song, Ivan Yonchovski")) (:maintainer "Vibhav Pant, Fangrui Song, Ivan Yonchovski") (:url . "https://github.com/emacs-lsp/lsp-mode"))])
|
||||
(lsp-julia . [(20191011 1005) ((emacs (25 1)) (lsp-mode (6 0)) (julia-mode (0 3))) "Julia support for lsp-mode" tar ((:commit . "6b0d1a3f32c5e6c5b4c0993f30303569a9e9e9bd") (:keywords "languages" "tools") (:authors ("Martin Wolke" . "vibhavp@gmail.com") ("Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") ("Guido Kraemer" . "gdkrmr@users.noreply.github.com")) (:maintainer "Adam Beckmeyer" . "adam_git@thebeckmeyers.xyz") (:url . "https://github.com/non-Jedi/lsp-julia"))])
|
||||
(lsp-javacomp . [(20190124 1755) ((emacs (25 1)) (lsp-mode (3 0)) (s (1 2 0))) "Provide Java IDE features powered by JavaComp." single ((:commit . "82aa4ad6ca03a74565c35e855b318b1887bcd89b") (:keywords "java" "tools" "lsp") (:url . "https://github.com/tigersoldier/lsp-javacomp"))])
|
||||
(lsp-java . [(20191016 1709) ((emacs (25 1)) (lsp-mode (6 0)) (markdown-mode (2 3)) (dash (2 14 1)) (f (0 20 0)) (ht (2 0)) (dash-functional (1 2 0)) (request (0 3 0)) (treemacs (2 5))) "Java support for lsp-mode" tar ((:commit . "52f61a539b9627122b39d9aff3885a1d94247d9a") (:keywords "java") (:url . "https://github.com/emacs-lsp/lsp-java"))])
|
||||
@@ -2887,7 +2887,7 @@
|
||||
(forth-mode . [(20170527 1930) nil "Programming language mode for Forth" tar ((:commit . "522256d98d1a909983bcfd3ae20c65226d5929b6") (:keywords "languages" "forth") (:authors ("Lars Brinkhoff" . "lars@nocrew.org")) (:maintainer "Lars Brinkhoff" . "lars@nocrew.org") (:url . "http://github.com/larsbrinkhoff/forth-mode"))])
|
||||
(format-table . [(20181223 1616) ((emacs (25)) (dash (2 14 1))) "Parse and reformat tabular data." single ((:commit . "dfcae3a867e574577fc09a43b045889ff155b58f") (:keywords "data") (:authors ("Jason Duncan" . "jasond496@msn.com")) (:maintainer "Jason Duncan" . "jasond496@msn.com") (:url . "https://github.com/functionreturnfunction/format-table"))])
|
||||
(format-sql . [(20150422 1333) nil "Use format-sql to make your SQL readable in directly Emacs." single ((:commit . "97f475c245cd6c81a72a265678e2087cee66ac7b") (:authors ("Friedrich Paetzke" . "paetzke@fastmail.fm")) (:maintainer "Friedrich Paetzke" . "paetzke@fastmail.fm") (:url . "https://github.com/paetzke/format-sql.el"))])
|
||||
(format-all . [(20191024 2151) ((emacs (24)) (cl-lib (0 5))) "Auto-format C, C++, JS, Python, Ruby and 40 other languages" single ((:commit . "a1d3ad48f21086788cd1effaf30227308a18d98f") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-format-all-the-code"))])
|
||||
(format-all . [(20191027 1434) ((emacs (24)) (cl-lib (0 5))) "Auto-format C, C++, JS, Python, Ruby and 40 other languages" single ((:commit . "1ba755198b4622d132ceaec07c5b0a1f24caea33") (:keywords "languages" "util") (:authors ("Lassi Kortela" . "lassi@lassi.io")) (:maintainer "Lassi Kortela" . "lassi@lassi.io") (:url . "https://github.com/lassik/emacs-format-all-the-code"))])
|
||||
(form-feed . [(20160102 2253) nil "Display ^L glyphs as horizontal lines" single ((:commit . "799ca3e72b20a59a755a094b8cead57f654f3170") (:keywords "faces") (:authors ("Vasilij Schneidermann" . "v.schneidermann@gmail.com")) (:maintainer "Vasilij Schneidermann" . "v.schneidermann@gmail.com") (:url . "https://github.com/wasamasa/form-feed"))])
|
||||
(forge . [(20191017 1801) ((emacs (25 1)) (closql (1 0 0)) (dash (2 14 1)) (emacsql-sqlite (3 0 0)) (ghub (20190319)) (let-alist (1 0 5)) (magit (20190408)) (markdown-mode (2 3)) (transient (0 1 0))) "Access Git forges from Magit." tar ((:commit . "63cbf81f166fc71861d8e3d246df8e5ccedcb9bb"))])
|
||||
(forest-blue-theme . [(20160627 842) ((emacs (24))) "Emacs theme with a dark background." single ((:commit . "58096ce1a25615d2bae806c3775bae3e2775019d") (:authors ("olkinn")) (:maintainer "olkinn"))])
|
||||
@@ -3047,7 +3047,7 @@
|
||||
(flycheck-ats2 . [(20170225 1636) ((emacs (24 1)) (flycheck (0 22))) "Flycheck: ATS2 support" single ((:commit . "9f77add8408462af35bdddf87e37a661880255e3") (:keywords "convenience" "tools" "languages") (:authors ("Mark Laws" . "mdl@60hz.org")) (:maintainer "Mark Laws" . "mdl@60hz.org") (:url . "http://github.com/drvink/flycheck-ats2"))])
|
||||
(flycheck-apertium . [(20181211 1038) ((flycheck (0 25))) "Apertium checkers in flycheck" tar ((:commit . "22b60a17836477ac1edd15dc85b14f88ca871ba9") (:keywords "convenience" "tools" "xml") (:authors ("Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st")) (:maintainer "Kevin Brubeck Unhammer" . "unhammer+apertium@mm.st") (:url . "http://wiki.apertium.org/wiki/Emacs"))])
|
||||
(flycheck-ameba . [(20190720 1845) ((emacs (24 4)) (flycheck (30))) "Add support for Ameba to Flycheck" single ((:commit . "8383f07d760a31a0737be9b7bdaff2f1cff67bfd") (:keywords "tools" "crystal" "ameba") (:url . "https://github.com/crystal-ameba/ameba.el"))])
|
||||
(flycheck . [(20191022 1117) ((dash (2 12 1)) (pkg-info (0 4)) (let-alist (1 0 4)) (seq (1 11)) (emacs (24 3))) "On-the-fly syntax checking" tar ((:commit . "0eaf67211b83c062e598694d2ba4efb444dc1dc6") (:keywords "convenience" "languages" "tools") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:url . "http://www.flycheck.org"))])
|
||||
(flycheck . [(20191027 1608) ((dash (2 12 1)) (pkg-info (0 4)) (let-alist (1 0 4)) (seq (1 11)) (emacs (24 3))) "On-the-fly syntax checking" tar ((:commit . "d8c5485143b6bdf339382138832bdd340b94c677") (:keywords "convenience" "languages" "tools") (:authors ("Sebastian Wiesner" . "swiesner@lunaryorn.com")) (:maintainer "Clément Pit-Claudel" . "clement.pitclaudel@live.com") (:url . "http://www.flycheck.org"))])
|
||||
(flx-isearch . [(20180103 514) ((emacs (24)) (flx (20140821)) (cl-lib (0 5))) "Fuzzy incremental searching for emacs" single ((:commit . "f132fd6367e369885ab3a865fbfe20eee989bc0b") (:keywords "convenience" "search" "flx") (:authors ("PythonNut" . "pythonnut@pythonnut.com")) (:maintainer "PythonNut" . "pythonnut@pythonnut.com") (:url . "https://github.com/pythonnut/flx-isearch"))])
|
||||
(flx-ido . [(20180117 1519) ((flx (0 1)) (cl-lib (0 3))) "flx integration for ido" single ((:commit . "46040d0b096a0340d91235561f27a959a61d0fef") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))])
|
||||
(flx . [(20151030 1812) ((cl-lib (0 3))) "fuzzy matching with good sorting" single ((:commit . "46040d0b096a0340d91235561f27a959a61d0fef") (:authors ("Le Wang")) (:maintainer "Le Wang") (:url . "https://github.com/lewang/flx"))])
|
||||
@@ -3444,7 +3444,7 @@
|
||||
(eimp . [(20120826 2039) nil "Emacs Image Manipulation Package" single ((:commit . "2e7536fe6d8f7faf1bad7a8ae37faba0162c3b4f") (:keywords "files" "frames") (:authors ("Matthew P. Hodges" . "MPHodges@member.fsf.org")) (:maintainer "Nic Ferrier" . "nferrier@ferrier.me.uk"))])
|
||||
(eide . [(20191001 2003) nil "IDE interface" tar ((:commit . "eafa97e61383ef943bd6c3f8c7d50953257d4ae1"))])
|
||||
(ego . [(20180301 104) ((emacs (24 5)) (ht (1 5)) (mustache (0 22)) (htmlize (1 47)) (org (8 0)) (dash (2 0 0)) (simple-httpd (1 4 5))) "a static site generator based on org mode, forked from org-page." tar ((:commit . "719809679c1a60887735db41abae53b61f08ef59"))])
|
||||
(eglot . [(20191026 2151) ((emacs (26 1)) (jsonrpc (1 0 7)) (flymake (1 0 5))) "Client for Language Server Protocol (LSP) servers" single ((:commit . "b4068181a8db1129dcd4eaf3e881f10067662e0e") (:keywords "convenience" "languages") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:url . "https://github.com/joaotavora/eglot"))])
|
||||
(eglot . [(20191027 1541) ((emacs (26 1)) (jsonrpc (1 0 7)) (flymake (1 0 5))) "Client for Language Server Protocol (LSP) servers" single ((:commit . "2ab8b59db44fd4dd9791ac203ac9f0915cc6824f") (:keywords "convenience" "languages") (:authors ("João Távora" . "joaotavora@gmail.com")) (:maintainer "João Távora" . "joaotavora@gmail.com") (:url . "https://github.com/joaotavora/eglot"))])
|
||||
(egison-mode . [(20190714 236) nil "Egison editing mode" single ((:commit . "ad82bff8e9477310ad9b7806711cecdfe6d24f14") (:authors ("Satoshi Egi" . "egisatoshi@gmail.com")) (:maintainer "Satoshi Egi" . "egisatoshi@gmail.com") (:url . "https://github.com/egisatoshi/egison3/blob/master/elisp/egison-mode.el"))])
|
||||
(egg . [(20181126 500) nil "Emacs Got Git - Emacs interface to Git" tar ((:commit . "00e768a78ac3d25f457eed667d02cac568480bf9") (:keywords "git" "version control" "release management") (:authors ("Bogolisk" . "bogolisk@gmail.com")) (:maintainer "Bogolisk" . "bogolisk@gmail.com"))])
|
||||
(egalgo . [(20190706 1611) ((dash (2 14)) (emacs (24))) "Genetic algorithm for Emacs" single ((:commit . "d98524799f95c6c6bd972e52790e7e6b9003725c") (:keywords "data") (:authors ("ROCKTAKEY" . "rocktakey@gmail.com")) (:maintainer "ROCKTAKEY" . "rocktakey@gmail.com") (:url . "https://github.com/ROCKTAKEY/egalgo"))])
|
||||
@@ -3537,7 +3537,7 @@
|
||||
(dotenv-mode . [(20180207 1914) ((emacs (24 3))) "Major mode for .env files" single ((:commit . "f4c52bcd5313379b9f2460db7f7a33119dfa96ea") (:authors ("Preetpal S. Sohal")) (:maintainer "Preetpal S. Sohal") (:url . "https://github.com/preetpalS/emacs-dotenv-mode"))])
|
||||
(dot-mode . [(20180312 2300) ((emacs (24 3))) "minor mode to repeat typing or commands" single ((:commit . "6ca22b73bcdae2363ee9641b822a60685df16a3e") (:keywords "convenience") (:authors ("Robert Wyrick" . "rob@wyrick.org")) (:maintainer "Robert Wyrick" . "rob@wyrick.org") (:url . "https://github.com/wyrickre/dot-mode"))])
|
||||
(doom-themes . [(20191026 102) ((emacs (25 1)) (cl-lib (0 5))) "an opinionated pack of modern color-themes" tar ((:commit . "50da9726732e1f26fa0e4dd63f3f8041016db47d") (:keywords "dark" "light" "blue" "atom" "one" "theme" "neotree" "icons" "faces" "nova") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-doom-theme"))])
|
||||
(doom-modeline . [(20191026 1931) ((emacs (25 1)) (all-the-icons (1 0 0)) (shrink-path (0 2 0)) (dash (2 11 0))) "A minimal and modern mode-line" tar ((:commit . "b2c0012252ec9b79e9ee790e766ae71a95ef41ff") (:keywords "faces" "mode-line") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:url . "https://github.com/seagle0128/doom-modeline"))])
|
||||
(doom-modeline . [(20191027 821) ((emacs (25 1)) (all-the-icons (1 0 0)) (shrink-path (0 2 0)) (dash (2 11 0))) "A minimal and modern mode-line" tar ((:commit . "79c705019af38351324f60ba1e06224b1100ccd8") (:keywords "faces" "mode-line") (:authors ("Vincent Zhang" . "seagle0128@gmail.com")) (:maintainer "Vincent Zhang" . "seagle0128@gmail.com") (:url . "https://github.com/seagle0128/doom-modeline"))])
|
||||
(doom . [(20180301 2308) ((cl-lib (0 5))) "DOM implementation and manipulation library" single ((:commit . "e59040aefc92dd9b3134eb623624307fb9e4327b") (:keywords "xml" "dom") (:authors ("Alex Schroeder" . "alex@gnu.org") ("Henrik.Motakef" . "elisp@henrik-motakef.de") ("Katherine Whitlock" . "toroidal-code@gmail.com") ("Syohei YOSHIDA" . "syohex@gmail.com")) (:maintainer "Alex Schroeder") (:url . "http://www.github.com/kensanata/doom.el/"))])
|
||||
(doneburn-theme . [(20181110 1857) nil "A light theme based on Bozhidar Batsov's Zenburn" single ((:commit . "6421d9e28d57cb73212c61ab7304abfe6f950ec9") (:keywords "faces" "themes") (:authors ("Manuel Uberti" . "manuel.uberti@inventati.org")) (:maintainer "Manuel Uberti" . "manuel.uberti@inventati.org") (:url . "http://github.com/manuel-uberti/doneburn-emacs"))])
|
||||
(dollaro . [(20151123 1302) ((s (1 6 0))) "simple text templates" single ((:commit . "500127f0172ac7a1eec627e026b59136580a74ac") (:keywords "tools" "convenience") (:authors ("Alessandro Piras" . "laynor@gmail.com")) (:maintainer "Alessandro Piras" . "laynor@gmail.com"))])
|
||||
@@ -3768,7 +3768,7 @@
|
||||
(counsel-notmuch . [(20181203 935) ((emacs (24)) (ivy (0 10 0)) (notmuch (0 21)) (s (1 12 0))) "Search emails in Notmuch asynchronously with Ivy" single ((:commit . "a4a1562935e4180c42524c51609d1283e9be0688") (:keywords "mail") (:authors ("Alexander Fu Xi" . "fuxialexander@gmail.com")) (:maintainer "Alexander Fu Xi" . "fuxialexander@gmail.com") (:url . "https://github.com/fuxialexander/counsel-notmuch"))])
|
||||
(counsel-gtags . [(20190923 1842) ((emacs (25 1)) (counsel (0 8 0)) (seq (1 0))) "ivy for GNU global" single ((:commit . "baac1a718aaa3ad6c439ab48903b12013de2cec0") (:authors ("Syohei YOSHIDA" . "syohex@gmail.com") ("Felipe Lema" . "felipelema@mortemale.org")) (:maintainer "Syohei YOSHIDA" . "syohex@gmail.com") (:url . "https://github.com/FelipeLema/emacs-counsel-gtags"))])
|
||||
(counsel-ffdata . [(20191017 1237) ((emacs (25 1)) (counsel (0 11 0)) (emacsql (3 0 0))) "Use ivy to access firefox data" single ((:commit . "88c2348c4039d9e562bd3d9a364708b01037c283") (:keywords "convenience" "tools" "matching") (:authors ("Zhu Zihao" . "all_but_last@163.com")) (:maintainer "Zhu Zihao" . "all_but_last@163.com") (:url . "https://github.com/cireu/counsel-ffdata"))])
|
||||
(counsel-etags . [(20191014 50) ((emacs (24 4)) (counsel (0 10 0)) (ivy (0 10 0))) "Fast and complete Ctags/Etags solution using ivy" tar ((:commit . "b08ed51b763e29fc5deb2952eb7e5ba7c3677b4a") (:keywords "tools" "convenience") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:url . "http://github.com/redguardtoo/counsel-etags"))])
|
||||
(counsel-etags . [(20191027 1230) ((emacs (24 4)) (counsel (0 10 0)) (ivy (0 10 0))) "Fast and complete Ctags/Etags solution using ivy" tar ((:commit . "7b9cb71947943084cac22751cfe62c8507a3b378") (:keywords "tools" "convenience") (:authors ("Chen Bin" . "chenbin.sh@gmail.com")) (:maintainer "Chen Bin" . "chenbin.sh@gmail.com") (:url . "http://github.com/redguardtoo/counsel-etags"))])
|
||||
(counsel-dash . [(20191021 1648) ((emacs (24 4)) (dash-docs (1 4 0)) (counsel (0 8 0)) (cl-lib (0 5))) "Browse dash docsets using Ivy" single ((:commit . "7027868d483b51d949b9f20fb8f34b122ca61520") (:keywords "dash" "ivy" "counsel") (:authors ("Nathan Kot" . "nk@nathankot.com")) (:maintainer "Nathan Kot" . "nk@nathankot.com") (:url . "https://github.com/nathankot/counsel-dash"))])
|
||||
(counsel-css . [(20180302 1036) ((emacs (24 4)) (counsel (0 7 0)) (cl-lib (0 5))) "stylesheet-selector-aware swiper" single ((:commit . "0536af00236cdce1ed08b40dd46c917e8b4b8869") (:keywords "convenience" "tools" "counsel" "swiper" "selector" "css" "less" "scss") (:authors ("Henrik Lissner <http://github/hlissner>")) (:maintainer "Henrik Lissner" . "henrik@lissner.net") (:url . "https://github.com/hlissner/emacs-counsel-css"))])
|
||||
(counsel-codesearch . [(20180925 803) ((codesearch (1)) (counsel (0 10 0)) (emacs (24)) (ivy (0 10 0))) "Counsel interface for codesearch.el" single ((:commit . "b7989fad3e06f301c31d5e896c42b6cc549a0e0c") (:keywords "tools") (:authors ("Austin Bingham" . "austin.bingham@gmail.com")) (:maintainer "Austin Bingham" . "austin.bingham@gmail.com") (:url . "https://github.com/abingham/emacs-counsel-codesearch"))])
|
||||
@@ -3969,7 +3969,7 @@
|
||||
(chee . [(20171123 2233) ((dash (2 12 1)) (s (1 10 0)) (f (0 18 2))) "Interface to chee using dired and image-dired" tar ((:commit . "669ff9ee429f24c3c2d03b83d9cb9aec5f86bb8b") (:url . "https://github.com/eikek/chee/tree/release/0.3.0/emacs"))])
|
||||
(checkbox . [(20141117 58) ((emacs (24)) (cl-lib (0 5))) "Quick manipulation of textual checkboxes" single ((:commit . "335afa4404adf72973195a580458927004664d98") (:keywords "convenience") (:authors ("Cameron Desautels" . "camdez@gmail.com")) (:maintainer "Cameron Desautels" . "camdez@gmail.com") (:url . "http://github.com/camdez/checkbox.el"))])
|
||||
(cheatsheet . [(20170126 2150) ((emacs (24)) (cl-lib (0 5))) "create your own cheatsheet" single ((:commit . "e4f8e0110167ea16a17a74517d1f10cb7ff805b8") (:keywords "convenience" "usability") (:authors ("Shirin Nikita" . "shirin.nikita@gmail.com")) (:maintainer "Shirin Nikita" . "shirin.nikita@gmail.com") (:url . "http://github.com/darksmile/cheatsheet/"))])
|
||||
(cheat-sh . [(20190520 1339) ((emacs (24))) "Interact with cheat.sh" single ((:commit . "4b29b3e7be0eadeddc8424b327cb2a2726f751f4") (:keywords "docs" "help") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/cheat-sh.el"))])
|
||||
(cheat-sh . [(20191027 1038) ((emacs (25 1))) "Interact with cheat.sh" single ((:commit . "bd970d7c576b8720d63a1e7fd88ea8a943f2160b") (:keywords "docs" "help") (:authors ("Dave Pearson" . "davep@davep.org")) (:maintainer "Dave Pearson" . "davep@davep.org") (:url . "https://github.com/davep/cheat-sh.el"))])
|
||||
(chatwork . [(20170511 442) nil "ChatWork client for Emacs" single ((:commit . "fea231d479f06bf40dbfcf45de143eecc9ed744c") (:keywords "web") (:authors ("Masayuki Ataka" . "masayuki.ataka@gmail.com")) (:maintainer "Masayuki Ataka" . "masayuki.ataka@gmail.com") (:url . "https://github.com/ataka/chatwork"))])
|
||||
(charmap . [(20160309 946) nil "Unicode table for Emacs" single ((:commit . "bd4b3e466d7a9433cf35167e3a68ec74fe631bb2") (:keywords "unicode" "character" "ucs") (:authors ("Anan Mikami" . "lateau@gmail.com")) (:maintainer "Anan Mikami" . "lateau@gmail.com") (:url . "https://github.com/lateau/charmap"))])
|
||||
(char-menu . [(20190713 1343) ((emacs (24 3)) (avy-menu (0 1))) "Create your own menu for fast insertion of arbitrary symbols" single ((:commit . "e73949b26406a397a70624f6086183cb41ce1353") (:keywords "convenience" "editing") (:authors ("Mark Karpov" . "markkarpov92@gmail.com")) (:maintainer "Mark Karpov" . "markkarpov92@gmail.com") (:url . "https://github.com/mrkkrp/char-menu"))])
|
||||
@@ -3982,7 +3982,7 @@
|
||||
(cframe . [(20190616 1946) ((emacs (25)) (buffer-manage (0 9)) (dash (2 13 0))) "customize a frame and fast switch size and positions" single ((:commit . "38026cbd004231c5525bea31723ced39311bb408") (:keywords "frame" "customize") (:authors ("Paul Landes")) (:maintainer "Paul Landes") (:url . "https://github.com/plandes/cframe"))])
|
||||
(cfml-mode . [(20190617 1130) ((emacs (25))) "Emacs mode for editing CFML files" single ((:commit . "b06d7cee2af0ed5d55a94f0db80fc1f429a1829a") (:authors ("Andrew Myers" . "am2605@gmail.com")) (:maintainer "Andrew Myers" . "am2605@gmail.com") (:url . "https://github.com/am2605/cfml-mode"))])
|
||||
(cff . [(20160118 2018) ((cl-lib (0 5)) (emacs (24))) "Search of the C/C++ file header by the source and vice versa" single ((:commit . "b6ab2a28e64ef06f281ec74cfe3114e450644dfa") (:keywords "find-file") (:authors ("Alexey Veretennikov" . "alexey.veretennikov@gmail.com")) (:maintainer "Alexey Veretennikov" . "alexey.veretennikov@gmail.com") (:url . "https://github.com/fourier/cff"))])
|
||||
(cfengine-code-style . [(20171115 2108) nil "C code style for CFEngine project." single ((:commit . "510a0d3506cca601195d53d0ce885a25b4084e1b") (:authors ("Mikhail Gusarov" . "mikhail.gusarov@cfengine.com")) (:maintainer "Mikhail Gusarov" . "mikhail.gusarov@cfengine.com") (:url . "https://github.com/cfengine/core"))])
|
||||
(cfengine-code-style . [(20171115 2108) nil "C code style for CFEngine project." single ((:commit . "c6065c0c999ed523c7438e87b99cbaecbd633c5a") (:authors ("Mikhail Gusarov" . "mikhail.gusarov@cfengine.com")) (:maintainer "Mikhail Gusarov" . "mikhail.gusarov@cfengine.com") (:url . "https://github.com/cfengine/core"))])
|
||||
(ceylon-mode . [(20180606 1324) ((emacs (25))) "Major mode for editing Ceylon source code" single ((:commit . "948515672bc596dc118e8e3ede3ede5ec6a3c95a") (:keywords "languages" "ceylon") (:authors ("Lucas Werkmeister" . "mail@lucaswerkmeister.de")) (:maintainer "Lucas Werkmeister" . "mail@lucaswerkmeister.de") (:url . "https://github.com/lucaswerkmeister/ceylon-mode"))])
|
||||
(cerbere . [(20181113 1641) ((pkg-info (0 5))) "Unit testing in Emacs for several programming languages" tar ((:commit . "c667c165d9c1657f13d2d46f09ba21b61f9402cc") (:keywords "python" "go" "php" "phpunit" "elisp" "ert" "tests" "tdd") (:authors ("Nicolas Lamirault" . "nicolas.lamirault@gmail.com")) (:maintainer "Nicolas Lamirault" . "nicolas.lamirault@gmail.com") (:url . "https://github.com/nlamirault/cerbere"))])
|
||||
(centimacro . [(20140306 1427) nil "Assign multiple macros as global key bindings" single ((:commit . "1b97a9b558ed9c49d5da1bfbf29b2506575c2742") (:keywords "macros") (:authors ("Oleh Krehel" . "ohwoeowho@gmail.com")) (:maintainer "Oleh Krehel" . "ohwoeowho@gmail.com") (:url . "https://github.com/abo-abo/centimacro"))])
|
||||
|
||||
22
elpa/dash-20191024.1908/dash-autoloads.el
Normal file
22
elpa/dash-20191024.1908/dash-autoloads.el
Normal file
@@ -0,0 +1,22 @@
|
||||
;;; dash-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "dash" "dash.el" (0 0 0 0))
|
||||
;;; Generated autoloads from dash.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "dash" '("dash-" "-keep" "-butlast" "-non" "-only-some" "-zip" "-e" "->" "-a" "-gr" "-when-let" "-d" "-l" "-s" "-p" "-r" "-m" "-i" "-f" "-u" "-value-to-list" "-t" "--" "-c" "!cons" "!cdr")))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; dash-autoloads.el ends here
|
||||
2
elpa/dash-20191024.1908/dash-pkg.el
Normal file
2
elpa/dash-20191024.1908/dash-pkg.el
Normal file
@@ -0,0 +1,2 @@
|
||||
;;; -*- no-byte-compile: t -*-
|
||||
(define-package "dash" "20191024.1908" "A modern list library for Emacs" 'nil :commit "9631947f2fbeed58b1d07a3ebc1340a3626b2823" :keywords '("lists") :authors '(("Magnar Sveen" . "magnars@gmail.com")) :maintainer '("Magnar Sveen" . "magnars@gmail.com"))
|
||||
3044
elpa/dash-20191024.1908/dash.el
Normal file
3044
elpa/dash-20191024.1908/dash.el
Normal file
File diff suppressed because it is too large
Load Diff
BIN
elpa/dash-20191024.1908/dash.elc
Normal file
BIN
elpa/dash-20191024.1908/dash.elc
Normal file
Binary file not shown.
22
elpa/deferred-20170901.1330/deferred-autoloads.el
Normal file
22
elpa/deferred-20170901.1330/deferred-autoloads.el
Normal file
@@ -0,0 +1,22 @@
|
||||
;;; deferred-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "deferred" "deferred.el" (0 0 0 0))
|
||||
;;; Generated autoloads from deferred.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "deferred" '("deferred:")))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; deferred-autoloads.el ends here
|
||||
2
elpa/deferred-20170901.1330/deferred-pkg.el
Normal file
2
elpa/deferred-20170901.1330/deferred-pkg.el
Normal file
@@ -0,0 +1,2 @@
|
||||
;;; -*- no-byte-compile: t -*-
|
||||
(define-package "deferred" "20170901.1330" "Simple asynchronous functions for emacs lisp" '((emacs "24.4")) :commit "2239671d94b38d92e9b28d4e12fd79814cfb9c16" :keywords '("deferred" "async") :authors '(("SAKURAI Masashi <m.sakurai at kiwanami.net>")) :maintainer '("SAKURAI Masashi <m.sakurai at kiwanami.net>") :url "https://github.com/kiwanami/emacs-deferred")
|
||||
972
elpa/deferred-20170901.1330/deferred.el
Normal file
972
elpa/deferred-20170901.1330/deferred.el
Normal file
@@ -0,0 +1,972 @@
|
||||
;;; deferred.el --- Simple asynchronous functions for emacs lisp -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2010-2016 SAKURAI Masashi
|
||||
|
||||
;; Author: SAKURAI Masashi <m.sakurai at kiwanami.net>
|
||||
;; Version: 0.5.1
|
||||
;; Package-Version: 20170901.1330
|
||||
;; Keywords: deferred, async
|
||||
;; Package-Requires: ((emacs "24.4"))
|
||||
;; URL: https://github.com/kiwanami/emacs-deferred
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; 'deferred.el' is a simple library for asynchronous tasks.
|
||||
;; [https://github.com/kiwanami/emacs-deferred]
|
||||
|
||||
;; The API is almost the same as JSDeferred written by cho45. See the
|
||||
;; JSDeferred and Mochikit.Async web sites for further documentations.
|
||||
;; [https://github.com/cho45/jsdeferred]
|
||||
;; [http://mochikit.com/doc/html/MochiKit/Async.html]
|
||||
|
||||
;; A good introduction document (JavaScript)
|
||||
;; [http://cho45.stfuawsc.com/jsdeferred/doc/intro.en.html]
|
||||
|
||||
;;; Samples:
|
||||
|
||||
;; ** HTTP Access
|
||||
|
||||
;; (require 'url)
|
||||
;; (deferred:$
|
||||
;; (deferred:url-retrieve "http://www.gnu.org")
|
||||
;; (deferred:nextc it
|
||||
;; (lambda (buf)
|
||||
;; (insert (with-current-buffer buf (buffer-string)))
|
||||
;; (kill-buffer buf))))
|
||||
|
||||
;; ** Invoking command tasks
|
||||
|
||||
;; (deferred:$
|
||||
;; (deferred:process "wget" "-O" "a.jpg" "http://www.gnu.org/software/emacs/tour/images/splash.png")
|
||||
;; (deferred:nextc it
|
||||
;; (lambda (x) (deferred:process "convert" "a.jpg" "-resize" "100x100" "jpg:b.jpg")))
|
||||
;; (deferred:nextc it
|
||||
;; (lambda (x)
|
||||
;; (insert-image (create-image (expand-file-name "b.jpg") 'jpeg nil)))))
|
||||
|
||||
;; See the readme for further API documentation.
|
||||
|
||||
;; ** Applications
|
||||
|
||||
;; *Inertial scrolling for Emacs
|
||||
;; [https://github.com/kiwanami/emacs-inertial-scroll]
|
||||
|
||||
;; This program makes simple multi-thread function, using
|
||||
;; deferred.el.
|
||||
|
||||
(require 'cl-lib)
|
||||
(require 'subr-x)
|
||||
|
||||
(declare-function pp-display-expression 'pp)
|
||||
|
||||
(defvar deferred:version nil "deferred.el version")
|
||||
(setq deferred:version "0.5.0")
|
||||
|
||||
;;; Code:
|
||||
|
||||
(defmacro deferred:aand (test &rest rest)
|
||||
"[internal] Anaphoric AND."
|
||||
(declare (debug ("test" form &rest form)))
|
||||
`(let ((it ,test))
|
||||
(if it ,(if rest `(deferred:aand ,@rest) 'it))))
|
||||
|
||||
(defmacro deferred:$ (&rest elements)
|
||||
"Anaphoric function chain macro for deferred chains."
|
||||
(declare (debug (&rest form)))
|
||||
`(let (it)
|
||||
,@(cl-loop for i in elements
|
||||
collect
|
||||
`(setq it ,i))
|
||||
it))
|
||||
|
||||
(defmacro deferred:lambda (args &rest body)
|
||||
"Anaphoric lambda macro for self recursion."
|
||||
(declare (debug ("args" form &rest form)))
|
||||
(let ((argsyms (cl-loop repeat (length args) collect (cl-gensym))))
|
||||
`(lambda (,@argsyms)
|
||||
(let (self)
|
||||
(setq self (lambda( ,@args ) ,@body))
|
||||
(funcall self ,@argsyms)))))
|
||||
|
||||
(cl-defmacro deferred:try (d &key catch finally)
|
||||
"Try-catch-finally macro. This macro simulates the
|
||||
try-catch-finally block asynchronously. CATCH and FINALLY can be
|
||||
nil. Because of asynchrony, this macro does not ensure that the
|
||||
task FINALLY should be called."
|
||||
(let ((chain
|
||||
(if catch `((deferred:error it ,catch)))))
|
||||
(when finally
|
||||
(setq chain (append chain `((deferred:watch it ,finally)))))
|
||||
`(deferred:$ ,d ,@chain)))
|
||||
|
||||
(defun deferred:setTimeout (f msec)
|
||||
"[internal] Timer function that emulates the `setTimeout' function in JS."
|
||||
(run-at-time (/ msec 1000.0) nil f))
|
||||
|
||||
(defun deferred:cancelTimeout (id)
|
||||
"[internal] Timer cancellation function that emulates the `cancelTimeout' function in JS."
|
||||
(cancel-timer id))
|
||||
|
||||
(defun deferred:run-with-idle-timer (sec f)
|
||||
"[internal] Wrapper function for run-with-idle-timer."
|
||||
(run-with-idle-timer sec nil f))
|
||||
|
||||
(defun deferred:call-lambda (f &optional arg)
|
||||
"[internal] Call a function with one or zero argument safely.
|
||||
The lambda function can define with zero and one argument."
|
||||
(condition-case err
|
||||
(funcall f arg)
|
||||
('wrong-number-of-arguments
|
||||
(display-warning 'deferred "\
|
||||
Callback that takes no argument may be specified.
|
||||
Passing callback with no argument is deprecated.
|
||||
Callback must take one argument.
|
||||
Or, this error is coming from somewhere inside of the callback: %S" err)
|
||||
(condition-case nil
|
||||
(funcall f)
|
||||
('wrong-number-of-arguments
|
||||
(signal 'wrong-number-of-arguments (cdr err))))))) ; return the first error
|
||||
|
||||
;; debug
|
||||
|
||||
(eval-and-compile
|
||||
(defvar deferred:debug nil "Debug output switch."))
|
||||
(defvar deferred:debug-count 0 "[internal] Debug output counter.")
|
||||
|
||||
(defmacro deferred:message (&rest args)
|
||||
"[internal] Debug log function."
|
||||
(when deferred:debug
|
||||
`(progn
|
||||
(with-current-buffer (get-buffer-create "*deferred:debug*")
|
||||
(save-excursion
|
||||
(goto-char (point-max))
|
||||
(insert (format "%5i %s\n" deferred:debug-count (format ,@args)))))
|
||||
(cl-incf deferred:debug-count))))
|
||||
|
||||
(defun deferred:message-mark ()
|
||||
"[internal] Debug log function."
|
||||
(interactive)
|
||||
(deferred:message "==================== mark ==== %s"
|
||||
(format-time-string "%H:%M:%S" (current-time))))
|
||||
|
||||
(defun deferred:pp (d)
|
||||
(require 'pp)
|
||||
(deferred:$
|
||||
(deferred:nextc d
|
||||
(lambda (x)
|
||||
(pp-display-expression x "*deferred:pp*")))
|
||||
(deferred:error it
|
||||
(lambda (e)
|
||||
(pp-display-expression e "*deferred:pp*")))
|
||||
(deferred:nextc it
|
||||
(lambda (_x) (pop-to-buffer "*deferred:pp*")))))
|
||||
|
||||
(defvar deferred:debug-on-signal nil
|
||||
"If non nil, the value `debug-on-signal' is substituted this
|
||||
value in the `condition-case' form in deferred
|
||||
implementations. Then, Emacs debugger can catch an error occurred
|
||||
in the asynchronous tasks.")
|
||||
|
||||
(defmacro deferred:condition-case (var protected-form &rest handlers)
|
||||
"[internal] Custom condition-case. See the comment for
|
||||
`deferred:debug-on-signal'."
|
||||
(declare (debug condition-case)
|
||||
(indent 2))
|
||||
`(let ((debug-on-signal
|
||||
(or debug-on-signal deferred:debug-on-signal)))
|
||||
(condition-case ,var
|
||||
,protected-form
|
||||
,@handlers)))
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Back end functions of deferred tasks
|
||||
|
||||
(defvar deferred:tick-time 0.001
|
||||
"Waiting time between asynchronous tasks (second).
|
||||
The shorter waiting time increases the load of Emacs. The end
|
||||
user can tune this parameter. However, applications should not
|
||||
modify it because the applications run on various environments.")
|
||||
|
||||
(defvar deferred:queue nil
|
||||
"[internal] The execution queue of deferred objects.
|
||||
See the functions `deferred:post-task' and `deferred:worker'.")
|
||||
|
||||
(defmacro deferred:pack (a b c)
|
||||
`(cons ,a (cons ,b ,c)))
|
||||
|
||||
(defun deferred:schedule-worker ()
|
||||
"[internal] Schedule consuming a deferred task in the execution queue."
|
||||
(run-at-time deferred:tick-time nil 'deferred:worker))
|
||||
|
||||
(defun deferred:post-task (d which &optional arg)
|
||||
"[internal] Add a deferred object to the execution queue
|
||||
`deferred:queue' and schedule to execute.
|
||||
D is a deferred object. WHICH is a symbol, `ok' or `ng'. ARG is
|
||||
an argument value for execution of the deferred task."
|
||||
(push (deferred:pack d which arg) deferred:queue)
|
||||
(deferred:message "QUEUE-POST [%s]: %s"
|
||||
(length deferred:queue) (deferred:pack d which arg))
|
||||
(deferred:schedule-worker)
|
||||
d)
|
||||
|
||||
(defun deferred:clear-queue ()
|
||||
"Clear the execution queue. For test and debugging."
|
||||
(interactive)
|
||||
(deferred:message "QUEUE-CLEAR [%s -> 0]" (length deferred:queue))
|
||||
(setq deferred:queue nil))
|
||||
|
||||
(defun deferred:worker ()
|
||||
"[internal] Consume a deferred task.
|
||||
Mainly this function is called by timer asynchronously."
|
||||
(when deferred:queue
|
||||
(let* ((pack (car (last deferred:queue)))
|
||||
(d (car pack))
|
||||
(which (cadr pack))
|
||||
(arg (cddr pack)) value)
|
||||
(setq deferred:queue (nbutlast deferred:queue))
|
||||
(condition-case err
|
||||
(setq value (deferred:exec-task d which arg))
|
||||
(error
|
||||
(deferred:message "ERROR : %s" err)
|
||||
(message "deferred error : %s" err)))
|
||||
value)))
|
||||
|
||||
(defun deferred:flush-queue! ()
|
||||
"Call all deferred tasks synchronously. For test and debugging."
|
||||
(let (value)
|
||||
(while deferred:queue
|
||||
(setq value (deferred:worker)))
|
||||
value))
|
||||
|
||||
(defun deferred:sync! (d)
|
||||
"Wait for the given deferred task. For test and debugging.
|
||||
Error is raised if it is not processed within deferred chain D."
|
||||
(progn
|
||||
(let ((last-value 'deferred:undefined*)
|
||||
uncaught-error)
|
||||
(deferred:try
|
||||
(deferred:nextc d
|
||||
(lambda (x) (setq last-value x)))
|
||||
:catch
|
||||
(lambda (err) (setq uncaught-error err)))
|
||||
(while (and (eq 'deferred:undefined* last-value)
|
||||
(not uncaught-error))
|
||||
(sit-for 0.05)
|
||||
(sleep-for 0.05))
|
||||
(when uncaught-error
|
||||
(deferred:resignal uncaught-error))
|
||||
last-value)))
|
||||
|
||||
|
||||
|
||||
;; Struct: deferred
|
||||
;;
|
||||
;; callback : a callback function (default `deferred:default-callback')
|
||||
;; errorback : an errorback function (default `deferred:default-errorback')
|
||||
;; cancel : a canceling function (default `deferred:default-cancel')
|
||||
;; next : a next chained deferred object (default nil)
|
||||
;; status : if 'ok or 'ng, this deferred has a result (error) value. (default nil)
|
||||
;; value : saved value (default nil)
|
||||
;;
|
||||
(cl-defstruct deferred
|
||||
(callback 'deferred:default-callback)
|
||||
(errorback 'deferred:default-errorback)
|
||||
(cancel 'deferred:default-cancel)
|
||||
next status value)
|
||||
|
||||
(defun deferred:default-callback (i)
|
||||
"[internal] Default callback function."
|
||||
(identity i))
|
||||
|
||||
(defun deferred:default-errorback (err)
|
||||
"[internal] Default errorback function."
|
||||
(deferred:resignal err))
|
||||
|
||||
(defun deferred:resignal (err)
|
||||
"[internal] Safely resignal ERR as an Emacs condition.
|
||||
|
||||
If ERR is a cons (ERROR-SYMBOL . DATA) where ERROR-SYMBOL has an
|
||||
`error-conditions' property, it is re-signaled unchanged. If ERR
|
||||
is a string, it is signaled as a generic error using `error'.
|
||||
Otherwise, ERR is formatted into a string as if by `print' before
|
||||
raising with `error'."
|
||||
(cond ((and (listp err)
|
||||
(symbolp (car err))
|
||||
(get (car err) 'error-conditions))
|
||||
(signal (car err) (cdr err)))
|
||||
((stringp err)
|
||||
(error "%s" err))
|
||||
(t
|
||||
(error "%S" err))))
|
||||
|
||||
(defun deferred:default-cancel (d)
|
||||
"[internal] Default canceling function."
|
||||
(deferred:message "CANCEL : %s" d)
|
||||
(setf (deferred-callback d) 'deferred:default-callback)
|
||||
(setf (deferred-errorback d) 'deferred:default-errorback)
|
||||
(setf (deferred-next d) nil)
|
||||
d)
|
||||
|
||||
(defvar deferred:onerror nil
|
||||
"Default error handler. This value is nil or a function that
|
||||
have one argument for the error message.")
|
||||
|
||||
(defun deferred:exec-task (d which &optional arg)
|
||||
"[internal] Executing deferred task. If the deferred object has
|
||||
next deferred task or the return value is a deferred object, this
|
||||
function adds the task to the execution queue.
|
||||
D is a deferred object. WHICH is a symbol, `ok' or `ng'. ARG is
|
||||
an argument value for execution of the deferred task."
|
||||
(deferred:message "EXEC : %s / %s / %s" d which arg)
|
||||
(when (null d) (error "deferred:exec-task was given a nil."))
|
||||
(let ((callback (if (eq which 'ok)
|
||||
(deferred-callback d)
|
||||
(deferred-errorback d)))
|
||||
(next-deferred (deferred-next d)))
|
||||
(cond
|
||||
(callback
|
||||
(deferred:condition-case err
|
||||
(let ((value (deferred:call-lambda callback arg)))
|
||||
(cond
|
||||
((deferred-p value)
|
||||
(deferred:message "WAIT NEST : %s" value)
|
||||
(if next-deferred
|
||||
(deferred:set-next value next-deferred)
|
||||
value))
|
||||
(t
|
||||
(if next-deferred
|
||||
(deferred:post-task next-deferred 'ok value)
|
||||
(setf (deferred-status d) 'ok)
|
||||
(setf (deferred-value d) value)
|
||||
value))))
|
||||
(error
|
||||
(cond
|
||||
(next-deferred
|
||||
(deferred:post-task next-deferred 'ng err))
|
||||
(deferred:onerror
|
||||
(deferred:call-lambda deferred:onerror err))
|
||||
(t
|
||||
(deferred:message "ERROR : %S" err)
|
||||
(message "deferred error : %S" err)
|
||||
(setf (deferred-status d) 'ng)
|
||||
(setf (deferred-value d) err)
|
||||
err)))))
|
||||
(t ; <= (null callback)
|
||||
(cond
|
||||
(next-deferred
|
||||
(deferred:exec-task next-deferred which arg))
|
||||
((eq which 'ok) arg)
|
||||
(t ; (eq which 'ng)
|
||||
(deferred:resignal arg)))))))
|
||||
|
||||
(defun deferred:set-next (prev next)
|
||||
"[internal] Connect deferred objects."
|
||||
(setf (deferred-next prev) next)
|
||||
(cond
|
||||
((eq 'ok (deferred-status prev))
|
||||
(setf (deferred-status prev) nil)
|
||||
(let ((ret (deferred:exec-task
|
||||
next 'ok (deferred-value prev))))
|
||||
(if (deferred-p ret) ret
|
||||
next)))
|
||||
((eq 'ng (deferred-status prev))
|
||||
(setf (deferred-status prev) nil)
|
||||
(let ((ret (deferred:exec-task next 'ng (deferred-value prev))))
|
||||
(if (deferred-p ret) ret
|
||||
next)))
|
||||
(t
|
||||
next)))
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Basic functions for deferred objects
|
||||
|
||||
(defun deferred:new (&optional callback)
|
||||
"Create a deferred object."
|
||||
(if callback
|
||||
(make-deferred :callback callback)
|
||||
(make-deferred)))
|
||||
|
||||
(defun deferred:callback (d &optional arg)
|
||||
"Start deferred chain with a callback message."
|
||||
(deferred:exec-task d 'ok arg))
|
||||
|
||||
(defun deferred:errorback (d &optional arg)
|
||||
"Start deferred chain with an errorback message."
|
||||
(deferred:exec-task d 'ng arg))
|
||||
|
||||
(defun deferred:callback-post (d &optional arg)
|
||||
"Add the deferred object to the execution queue."
|
||||
(deferred:post-task d 'ok arg))
|
||||
|
||||
(defun deferred:errorback-post (d &optional arg)
|
||||
"Add the deferred object to the execution queue."
|
||||
(deferred:post-task d 'ng arg))
|
||||
|
||||
(defun deferred:cancel (d)
|
||||
"Cancel all callbacks and deferred chain in the deferred object."
|
||||
(deferred:message "CANCEL : %s" d)
|
||||
(funcall (deferred-cancel d) d)
|
||||
d)
|
||||
|
||||
(defun deferred:status (d)
|
||||
"Return a current status of the deferred object. The returned value means following:
|
||||
`ok': the callback was called and waiting for next deferred.
|
||||
`ng': the errorback was called and waiting for next deferred.
|
||||
nil: The neither callback nor errorback was not called."
|
||||
(deferred-status d))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Basic utility functions
|
||||
|
||||
(defun deferred:succeed (&optional arg)
|
||||
"Create a synchronous deferred object."
|
||||
(let ((d (deferred:new)))
|
||||
(deferred:exec-task d 'ok arg)
|
||||
d))
|
||||
|
||||
(defun deferred:fail (&optional arg)
|
||||
"Create a synchronous deferred object."
|
||||
(let ((d (deferred:new)))
|
||||
(deferred:exec-task d 'ng arg)
|
||||
d))
|
||||
|
||||
(defun deferred:next (&optional callback arg)
|
||||
"Create a deferred object and schedule executing. This function
|
||||
is a short cut of following code:
|
||||
(deferred:callback-post (deferred:new callback))."
|
||||
(let ((d (if callback
|
||||
(make-deferred :callback callback)
|
||||
(make-deferred))))
|
||||
(deferred:callback-post d arg)
|
||||
d))
|
||||
|
||||
(defun deferred:nextc (d callback)
|
||||
"Create a deferred object with OK callback and connect it to the given deferred object."
|
||||
(let ((nd (make-deferred :callback callback)))
|
||||
(deferred:set-next d nd)))
|
||||
|
||||
(defun deferred:error (d callback)
|
||||
"Create a deferred object with errorback and connect it to the given deferred object."
|
||||
(let ((nd (make-deferred :errorback callback)))
|
||||
(deferred:set-next d nd)))
|
||||
|
||||
(defun deferred:watch (d callback)
|
||||
"Create a deferred object with watch task and connect it to the given deferred object.
|
||||
The watch task CALLBACK can not affect deferred chains with
|
||||
return values. This function is used in following purposes,
|
||||
simulation of try-finally block in asynchronous tasks, progress
|
||||
monitoring of tasks."
|
||||
(let* ((callback callback)
|
||||
(normal (lambda (x) (ignore-errors (deferred:call-lambda callback x)) x))
|
||||
(err (lambda (e)
|
||||
(ignore-errors (deferred:call-lambda callback e))
|
||||
(deferred:resignal e))))
|
||||
(let ((nd (make-deferred :callback normal :errorback err)))
|
||||
(deferred:set-next d nd))))
|
||||
|
||||
(defun deferred:wait (msec)
|
||||
"Return a deferred object scheduled at MSEC millisecond later."
|
||||
(let ((d (deferred:new)) (start-time (float-time)) timer)
|
||||
(deferred:message "WAIT : %s" msec)
|
||||
(setq timer (deferred:setTimeout
|
||||
(lambda ()
|
||||
(deferred:exec-task d 'ok
|
||||
(* 1000.0 (- (float-time) start-time)))
|
||||
nil) msec))
|
||||
(setf (deferred-cancel d)
|
||||
(lambda (x)
|
||||
(deferred:cancelTimeout timer)
|
||||
(deferred:default-cancel x)))
|
||||
d))
|
||||
|
||||
(defun deferred:wait-idle (msec)
|
||||
"Return a deferred object which will run when Emacs has been
|
||||
idle for MSEC millisecond."
|
||||
(let ((d (deferred:new)) (start-time (float-time)) timer)
|
||||
(deferred:message "WAIT-IDLE : %s" msec)
|
||||
(setq timer
|
||||
(deferred:run-with-idle-timer
|
||||
(/ msec 1000.0)
|
||||
(lambda ()
|
||||
(deferred:exec-task d 'ok
|
||||
(* 1000.0 (- (float-time) start-time)))
|
||||
nil)))
|
||||
(setf (deferred-cancel d)
|
||||
(lambda (x)
|
||||
(deferred:cancelTimeout timer)
|
||||
(deferred:default-cancel x)))
|
||||
d))
|
||||
|
||||
(defun deferred:call (f &rest args)
|
||||
"Call the given function asynchronously."
|
||||
(deferred:next
|
||||
(lambda (_x)
|
||||
(apply f args))))
|
||||
|
||||
(defun deferred:apply (f &optional args)
|
||||
"Call the given function asynchronously."
|
||||
(deferred:next
|
||||
(lambda (_x)
|
||||
(apply f args))))
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Utility functions
|
||||
|
||||
(defun deferred:empty-p (times-or-seq)
|
||||
"[internal] Return non-nil if TIMES-OR-SEQ is the number zero or nil."
|
||||
(or (and (numberp times-or-seq) (<= times-or-seq 0))
|
||||
(and (sequencep times-or-seq) (= (length times-or-seq) 0))))
|
||||
|
||||
(defun deferred:loop (times-or-seq func)
|
||||
"Return a iteration deferred object."
|
||||
(deferred:message "LOOP : %s" times-or-seq)
|
||||
(if (deferred:empty-p times-or-seq) (deferred:next)
|
||||
(let* (items (rd
|
||||
(cond
|
||||
((numberp times-or-seq)
|
||||
(cl-loop for i from 0 below times-or-seq
|
||||
with ld = (deferred:next)
|
||||
do
|
||||
(push ld items)
|
||||
(setq ld
|
||||
(let ((i i))
|
||||
(deferred:nextc ld
|
||||
(lambda (_x) (deferred:call-lambda func i)))))
|
||||
finally return ld))
|
||||
((sequencep times-or-seq)
|
||||
(cl-loop for i in (append times-or-seq nil) ; seq->list
|
||||
with ld = (deferred:next)
|
||||
do
|
||||
(push ld items)
|
||||
(setq ld
|
||||
(let ((i i))
|
||||
(deferred:nextc ld
|
||||
(lambda (_x) (deferred:call-lambda func i)))))
|
||||
finally return ld)))))
|
||||
(setf (deferred-cancel rd)
|
||||
(lambda (x) (deferred:default-cancel x)
|
||||
(cl-loop for i in items
|
||||
do (deferred:cancel i))))
|
||||
rd)))
|
||||
|
||||
(defun deferred:trans-multi-args (args self-func list-func main-func)
|
||||
"[internal] Check the argument values and dispatch to methods."
|
||||
(cond
|
||||
((and (= 1 (length args)) (consp (car args)) (not (functionp (car args))))
|
||||
(let ((lst (car args)))
|
||||
(cond
|
||||
((or (null lst) (null (car lst)))
|
||||
(deferred:next))
|
||||
((deferred:aand lst (car it) (or (functionp it) (deferred-p it)))
|
||||
;; a list of deferred objects
|
||||
(funcall list-func lst))
|
||||
((deferred:aand lst (consp it))
|
||||
;; an alist of deferred objects
|
||||
(funcall main-func lst))
|
||||
(t (error "Wrong argument type. %s" args)))))
|
||||
(t (funcall self-func args))))
|
||||
|
||||
(defun deferred:parallel-array-to-alist (lst)
|
||||
"[internal] Translation array to alist."
|
||||
(cl-loop for d in lst
|
||||
for i from 0 below (length lst)
|
||||
collect (cons i d)))
|
||||
|
||||
(defun deferred:parallel-alist-to-array (alst)
|
||||
"[internal] Translation alist to array."
|
||||
(cl-loop for pair in
|
||||
(sort alst (lambda (x y)
|
||||
(< (car x) (car y))))
|
||||
collect (cdr pair)))
|
||||
|
||||
(defun deferred:parallel-func-to-deferred (alst)
|
||||
"[internal] Normalization for parallel and earlier arguments."
|
||||
(cl-loop for pair in alst
|
||||
for d = (cdr pair)
|
||||
collect
|
||||
(progn
|
||||
(unless (deferred-p d)
|
||||
(setf (cdr pair) (deferred:next d)))
|
||||
pair)))
|
||||
|
||||
(defun deferred:parallel-main (alst)
|
||||
"[internal] Deferred alist implementation for `deferred:parallel'. "
|
||||
(deferred:message "PARALLEL<KEY . VALUE>" )
|
||||
(let ((nd (deferred:new))
|
||||
(len (length alst))
|
||||
values)
|
||||
(cl-loop for pair in
|
||||
(deferred:parallel-func-to-deferred alst)
|
||||
with cd ; current child deferred
|
||||
do
|
||||
(let ((name (car pair)))
|
||||
(setq cd
|
||||
(deferred:nextc (cdr pair)
|
||||
(lambda (x)
|
||||
(push (cons name x) values)
|
||||
(deferred:message "PARALLEL VALUE [%s/%s] %s"
|
||||
(length values) len (cons name x))
|
||||
(when (= len (length values))
|
||||
(deferred:message "PARALLEL COLLECTED")
|
||||
(deferred:post-task nd 'ok (nreverse values)))
|
||||
nil)))
|
||||
(deferred:error cd
|
||||
(lambda (e)
|
||||
(push (cons name e) values)
|
||||
(deferred:message "PARALLEL ERROR [%s/%s] %s"
|
||||
(length values) len (cons name e))
|
||||
(when (= (length values) len)
|
||||
(deferred:message "PARALLEL COLLECTED")
|
||||
(deferred:post-task nd 'ok (nreverse values)))
|
||||
nil))))
|
||||
nd))
|
||||
|
||||
(defun deferred:parallel-list (lst)
|
||||
"[internal] Deferred list implementation for `deferred:parallel'. "
|
||||
(deferred:message "PARALLEL<LIST>" )
|
||||
(let* ((pd (deferred:parallel-main (deferred:parallel-array-to-alist lst)))
|
||||
(rd (deferred:nextc pd 'deferred:parallel-alist-to-array)))
|
||||
(setf (deferred-cancel rd)
|
||||
(lambda (x) (deferred:default-cancel x)
|
||||
(deferred:cancel pd)))
|
||||
rd))
|
||||
|
||||
(defun deferred:parallel (&rest args)
|
||||
"Return a deferred object that calls given deferred objects or
|
||||
functions in parallel and wait for all callbacks. The following
|
||||
deferred task will be called with an array of the return
|
||||
values. ARGS can be a list or an alist of deferred objects or
|
||||
functions."
|
||||
(deferred:message "PARALLEL : %s" args)
|
||||
(deferred:trans-multi-args args
|
||||
'deferred:parallel 'deferred:parallel-list 'deferred:parallel-main))
|
||||
|
||||
(defun deferred:earlier-main (alst)
|
||||
"[internal] Deferred alist implementation for `deferred:earlier'. "
|
||||
(deferred:message "EARLIER<KEY . VALUE>" )
|
||||
(let ((nd (deferred:new))
|
||||
(len (length alst))
|
||||
value results)
|
||||
(cl-loop for pair in
|
||||
(deferred:parallel-func-to-deferred alst)
|
||||
with cd ; current child deferred
|
||||
do
|
||||
(let ((name (car pair)))
|
||||
(setq cd
|
||||
(deferred:nextc (cdr pair)
|
||||
(lambda (x)
|
||||
(push (cons name x) results)
|
||||
(cond
|
||||
((null value)
|
||||
(setq value (cons name x))
|
||||
(deferred:message "EARLIER VALUE %s" (cons name value))
|
||||
(deferred:post-task nd 'ok value))
|
||||
(t
|
||||
(deferred:message "EARLIER MISS [%s/%s] %s" (length results) len (cons name value))
|
||||
(when (eql (length results) len)
|
||||
(deferred:message "EARLIER COLLECTED"))))
|
||||
nil)))
|
||||
(deferred:error cd
|
||||
(lambda (e)
|
||||
(push (cons name e) results)
|
||||
(deferred:message "EARLIER ERROR [%s/%s] %s" (length results) len (cons name e))
|
||||
(when (and (eql (length results) len) (null value))
|
||||
(deferred:message "EARLIER FAILED")
|
||||
(deferred:post-task nd 'ok nil))
|
||||
nil))))
|
||||
nd))
|
||||
|
||||
(defun deferred:earlier-list (lst)
|
||||
"[internal] Deferred list implementation for `deferred:earlier'. "
|
||||
(deferred:message "EARLIER<LIST>" )
|
||||
(let* ((pd (deferred:earlier-main (deferred:parallel-array-to-alist lst)))
|
||||
(rd (deferred:nextc pd (lambda (x) (cdr x)))))
|
||||
(setf (deferred-cancel rd)
|
||||
(lambda (x) (deferred:default-cancel x)
|
||||
(deferred:cancel pd)))
|
||||
rd))
|
||||
|
||||
|
||||
(defun deferred:earlier (&rest args)
|
||||
"Return a deferred object that calls given deferred objects or
|
||||
functions in parallel and wait for the first callback. The
|
||||
following deferred task will be called with the first return
|
||||
value. ARGS can be a list or an alist of deferred objects or
|
||||
functions."
|
||||
(deferred:message "EARLIER : %s" args)
|
||||
(deferred:trans-multi-args args
|
||||
'deferred:earlier 'deferred:earlier-list 'deferred:earlier-main))
|
||||
|
||||
(defmacro deferred:timeout (timeout-msec timeout-form d)
|
||||
"Time out macro on a deferred task D. If the deferred task D
|
||||
does not complete within TIMEOUT-MSEC, this macro cancels the
|
||||
deferred task and return the TIMEOUT-FORM."
|
||||
`(deferred:earlier
|
||||
(deferred:nextc (deferred:wait ,timeout-msec)
|
||||
(lambda (x) ,timeout-form))
|
||||
,d))
|
||||
|
||||
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Application functions
|
||||
|
||||
(defvar deferred:uid 0 "[internal] Sequence number for some utilities. See the function `deferred:uid'.")
|
||||
|
||||
(defun deferred:uid ()
|
||||
"[internal] Generate a sequence number."
|
||||
(cl-incf deferred:uid))
|
||||
|
||||
(defun deferred:buffer-string (strformat buf)
|
||||
"[internal] Return a string in the buffer with the given format."
|
||||
(format strformat
|
||||
(with-current-buffer buf (buffer-string))))
|
||||
|
||||
(defun deferred:process (command &rest args)
|
||||
"A deferred wrapper of `start-process'. Return a deferred
|
||||
object. The process name and buffer name of the argument of the
|
||||
`start-process' are generated by this function automatically.
|
||||
The next deferred object receives stdout and stderr string from
|
||||
the command process."
|
||||
(deferred:process-gen 'start-process command args))
|
||||
|
||||
(defun deferred:process-shell (command &rest args)
|
||||
"A deferred wrapper of `start-process-shell-command'. Return a deferred
|
||||
object. The process name and buffer name of the argument of the
|
||||
`start-process-shell-command' are generated by this function automatically.
|
||||
The next deferred object receives stdout and stderr string from
|
||||
the command process."
|
||||
(deferred:process-gen 'start-process-shell-command command args))
|
||||
|
||||
(defun deferred:process-buffer (command &rest args)
|
||||
"A deferred wrapper of `start-process'. Return a deferred
|
||||
object. The process name and buffer name of the argument of the
|
||||
`start-process' are generated by this function automatically.
|
||||
The next deferred object receives stdout and stderr buffer from
|
||||
the command process."
|
||||
(deferred:process-buffer-gen 'start-process command args))
|
||||
|
||||
(defun deferred:process-shell-buffer (command &rest args)
|
||||
"A deferred wrapper of `start-process-shell-command'. Return a deferred
|
||||
object. The process name and buffer name of the argument of the
|
||||
`start-process-shell-command' are generated by this function automatically.
|
||||
The next deferred object receives stdout and stderr buffer from
|
||||
the command process."
|
||||
(deferred:process-buffer-gen 'start-process-shell-command command args))
|
||||
|
||||
(defun deferred:process-gen (f command args)
|
||||
"[internal]"
|
||||
(let ((pd (deferred:process-buffer-gen f command args)) d)
|
||||
(setq d (deferred:nextc pd
|
||||
(lambda (buf)
|
||||
(prog1
|
||||
(with-current-buffer buf (buffer-string))
|
||||
(kill-buffer buf)))))
|
||||
(setf (deferred-cancel d)
|
||||
(lambda (_x)
|
||||
(deferred:default-cancel d)
|
||||
(deferred:default-cancel pd)))
|
||||
d))
|
||||
|
||||
(defun deferred:process-buffer-gen (f command args)
|
||||
"[internal]"
|
||||
(let ((d (deferred:next)) (uid (deferred:uid)))
|
||||
(let ((proc-name (format "*deferred:*%s*:%s" command uid))
|
||||
(buf-name (format " *deferred:*%s*:%s" command uid))
|
||||
(pwd default-directory)
|
||||
(env process-environment)
|
||||
(con-type process-connection-type)
|
||||
(nd (deferred:new)) proc-buf proc)
|
||||
(deferred:nextc d
|
||||
(lambda (_x)
|
||||
(setq proc-buf (get-buffer-create buf-name))
|
||||
(condition-case err
|
||||
(let ((default-directory pwd)
|
||||
(process-environment env)
|
||||
(process-connection-type con-type))
|
||||
(setq proc
|
||||
(if (null (car args))
|
||||
(apply f proc-name buf-name command nil)
|
||||
(apply f proc-name buf-name command args)))
|
||||
(set-process-sentinel
|
||||
proc
|
||||
(lambda (proc event)
|
||||
(unless (process-live-p proc)
|
||||
(if (zerop (process-exit-status proc))
|
||||
(deferred:post-task nd 'ok proc-buf)
|
||||
(let ((msg (format "Deferred process exited abnormally:\n command: %s\n exit status: %s %s\n event: %s\n buffer contents: %S"
|
||||
command
|
||||
(process-status proc)
|
||||
(process-exit-status proc)
|
||||
(string-trim-right event)
|
||||
(if (buffer-live-p proc-buf)
|
||||
(with-current-buffer proc-buf
|
||||
(buffer-string))
|
||||
"(unavailable)"))))
|
||||
(kill-buffer proc-buf)
|
||||
(deferred:post-task nd 'ng msg))))))
|
||||
(setf (deferred-cancel nd)
|
||||
(lambda (x) (deferred:default-cancel x)
|
||||
(when proc
|
||||
(kill-process proc)
|
||||
(kill-buffer proc-buf)))))
|
||||
(error (deferred:post-task nd 'ng err)))
|
||||
nil))
|
||||
nd)))
|
||||
|
||||
(defmacro deferred:processc (d command &rest args)
|
||||
"Process chain of `deferred:process'."
|
||||
`(deferred:nextc ,d
|
||||
(lambda (,(cl-gensym)) (deferred:process ,command ,@args))))
|
||||
|
||||
(defmacro deferred:process-bufferc (d command &rest args)
|
||||
"Process chain of `deferred:process-buffer'."
|
||||
`(deferred:nextc ,d
|
||||
(lambda (,(cl-gensym)) (deferred:process-buffer ,command ,@args))))
|
||||
|
||||
(defmacro deferred:process-shellc (d command &rest args)
|
||||
"Process chain of `deferred:process'."
|
||||
`(deferred:nextc ,d
|
||||
(lambda (,(cl-gensym)) (deferred:process-shell ,command ,@args))))
|
||||
|
||||
(defmacro deferred:process-shell-bufferc (d command &rest args)
|
||||
"Process chain of `deferred:process-buffer'."
|
||||
`(deferred:nextc ,d
|
||||
(lambda (,(cl-gensym)) (deferred:process-shell-buffer ,command ,@args))))
|
||||
|
||||
;; Special variables defined in url-vars.el.
|
||||
(defvar url-request-data)
|
||||
(defvar url-request-method)
|
||||
(defvar url-request-extra-headers)
|
||||
|
||||
(declare-function url-http-symbol-value-in-buffer "url-http"
|
||||
(symbol buffer &optional unbound-value))
|
||||
|
||||
(declare-function deferred:url-param-serialize "request" (params))
|
||||
|
||||
(declare-function deferred:url-escape "request" (val))
|
||||
|
||||
(eval-after-load "url"
|
||||
;; for url package
|
||||
;; TODO: proxy, charaset
|
||||
;; List of gloabl variables to preserve and restore before url-retrieve call
|
||||
'(let ((url-global-variables '(url-request-data
|
||||
url-request-method
|
||||
url-request-extra-headers)))
|
||||
|
||||
(defun deferred:url-retrieve (url &optional cbargs silent inhibit-cookies)
|
||||
"A wrapper function for url-retrieve. The next deferred
|
||||
object receives the buffer object that URL will load
|
||||
into. Values of dynamically bound 'url-request-data', 'url-request-method' and
|
||||
'url-request-extra-headers' are passed to url-retrieve call."
|
||||
(let ((nd (deferred:new))
|
||||
buf
|
||||
(local-values (mapcar (lambda (symbol) (symbol-value symbol)) url-global-variables)))
|
||||
(deferred:next
|
||||
(lambda (_x)
|
||||
(cl-progv url-global-variables local-values
|
||||
(condition-case err
|
||||
(setq buf
|
||||
(url-retrieve
|
||||
url (lambda (_xx) (deferred:post-task nd 'ok buf))
|
||||
cbargs silent inhibit-cookies))
|
||||
(error (deferred:post-task nd 'ng err)))
|
||||
nil)))
|
||||
(setf (deferred-cancel nd)
|
||||
(lambda (_x)
|
||||
(when (buffer-live-p buf)
|
||||
(kill-buffer buf))))
|
||||
nd))
|
||||
|
||||
(defun deferred:url-delete-header (buf)
|
||||
(with-current-buffer buf
|
||||
(let ((pos (url-http-symbol-value-in-buffer
|
||||
'url-http-end-of-headers buf)))
|
||||
(when pos
|
||||
(delete-region (point-min) (1+ pos)))))
|
||||
buf)
|
||||
|
||||
(defun deferred:url-delete-buffer (buf)
|
||||
(when (and buf (buffer-live-p buf))
|
||||
(kill-buffer buf))
|
||||
nil)
|
||||
|
||||
(defun deferred:url-get (url &optional params &rest args)
|
||||
"Perform a HTTP GET method with `url-retrieve'. PARAMS is
|
||||
a parameter list of (key . value) or key. ARGS will be appended
|
||||
to deferred:url-retrieve args list. The next deferred
|
||||
object receives the buffer object that URL will load into."
|
||||
(when params
|
||||
(setq url
|
||||
(concat url "?" (deferred:url-param-serialize params))))
|
||||
(let ((d (deferred:$
|
||||
(apply 'deferred:url-retrieve url args)
|
||||
(deferred:nextc it 'deferred:url-delete-header))))
|
||||
(deferred:set-next
|
||||
d (deferred:new 'deferred:url-delete-buffer))
|
||||
d))
|
||||
|
||||
(defun deferred:url-post (url &optional params &rest args)
|
||||
"Perform a HTTP POST method with `url-retrieve'. PARAMS is
|
||||
a parameter list of (key . value) or key. ARGS will be appended
|
||||
to deferred:url-retrieve args list. The next deferred
|
||||
object receives the buffer object that URL will load into."
|
||||
(let ((url-request-method "POST")
|
||||
(url-request-extra-headers
|
||||
(append url-request-extra-headers
|
||||
'(("Content-Type" . "application/x-www-form-urlencoded"))))
|
||||
(url-request-data (deferred:url-param-serialize params)))
|
||||
(let ((d (deferred:$
|
||||
(apply 'deferred:url-retrieve url args)
|
||||
(deferred:nextc it 'deferred:url-delete-header))))
|
||||
(deferred:set-next
|
||||
d (deferred:new 'deferred:url-delete-buffer))
|
||||
d)))
|
||||
|
||||
(defun deferred:url-escape (val)
|
||||
"[internal] Return a new string that is VAL URI-encoded."
|
||||
(unless (stringp val)
|
||||
(setq val (format "%s" val)))
|
||||
(url-hexify-string
|
||||
(encode-coding-string val 'utf-8)))
|
||||
|
||||
(defun deferred:url-param-serialize (params)
|
||||
"[internal] Serialize a list of (key . value) cons cells
|
||||
into a query string."
|
||||
(when params
|
||||
(mapconcat
|
||||
'identity
|
||||
(cl-loop for p in params
|
||||
collect
|
||||
(cond
|
||||
((consp p)
|
||||
(concat
|
||||
(deferred:url-escape (car p)) "="
|
||||
(deferred:url-escape (cdr p))))
|
||||
(t
|
||||
(deferred:url-escape p))))
|
||||
"&")))
|
||||
))
|
||||
|
||||
|
||||
(provide 'deferred)
|
||||
;;; deferred.el ends here
|
||||
BIN
elpa/deferred-20170901.1330/deferred.elc
Normal file
BIN
elpa/deferred-20170901.1330/deferred.elc
Normal file
Binary file not shown.
22
elpa/f-20190109.906/f-autoloads.el
Normal file
22
elpa/f-20190109.906/f-autoloads.el
Normal file
@@ -0,0 +1,22 @@
|
||||
;;; f-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "f" "f.el" (0 0 0 0))
|
||||
;;; Generated autoloads from f.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "f" '("f-")))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; f-autoloads.el ends here
|
||||
2
elpa/f-20190109.906/f-pkg.el
Normal file
2
elpa/f-20190109.906/f-pkg.el
Normal file
@@ -0,0 +1,2 @@
|
||||
;;; -*- no-byte-compile: t -*-
|
||||
(define-package "f" "20190109.906" "Modern API for working with files and directories" '((s "1.7.0") (dash "2.2.0")) :commit "8191672377816a1975414cc1f116fd3b94b30bd0" :keywords '("files" "directories") :authors '(("Johan Andersson" . "johan.rejeep@gmail.com")) :maintainer '("Johan Andersson" . "johan.rejeep@gmail.com") :url "http://github.com/rejeep/f.el")
|
||||
624
elpa/f-20190109.906/f.el
Normal file
624
elpa/f-20190109.906/f.el
Normal file
@@ -0,0 +1,624 @@
|
||||
;;; f.el --- Modern API for working with files and directories -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2013 Johan Andersson
|
||||
|
||||
;; Author: Johan Andersson <johan.rejeep@gmail.com>
|
||||
;; Maintainer: Johan Andersson <johan.rejeep@gmail.com>
|
||||
;; Version: 0.20.0
|
||||
;; Package-Version: 20190109.906
|
||||
;; Keywords: files, directories
|
||||
;; URL: http://github.com/rejeep/f.el
|
||||
;; Package-Requires: ((s "1.7.0") (dash "2.2.0"))
|
||||
|
||||
;; This file is NOT part of GNU Emacs.
|
||||
|
||||
;;; License:
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation; either version 3, or (at your option)
|
||||
;; any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with GNU Emacs; see the file COPYING. If not, write to the
|
||||
;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
;; Boston, MA 02110-1301, USA.
|
||||
|
||||
;;; Code:
|
||||
|
||||
|
||||
|
||||
(require 's)
|
||||
(require 'dash)
|
||||
|
||||
(put 'f-guard-error 'error-conditions '(error f-guard-error))
|
||||
(put 'f-guard-error 'error-message "Destructive operation outside sandbox")
|
||||
|
||||
(defvar f--guard-paths nil
|
||||
"List of allowed paths to modify when guarded.
|
||||
|
||||
Do not modify this variable.")
|
||||
|
||||
(defmacro f--destructive (path &rest body)
|
||||
"If PATH is allowed to be modified, yield BODY.
|
||||
|
||||
If PATH is not allowed to be modified, throw error."
|
||||
(declare (indent 1))
|
||||
`(if f--guard-paths
|
||||
(if (--any? (or (f-same? it ,path)
|
||||
(f-ancestor-of? it ,path)) f--guard-paths)
|
||||
(progn ,@body)
|
||||
(signal 'f-guard-error (list ,path f--guard-paths)))
|
||||
,@body))
|
||||
|
||||
|
||||
;;;; Paths
|
||||
|
||||
(defun f-join (&rest args)
|
||||
"Join ARGS to a single path."
|
||||
(let (path (relative (f-relative? (car args))))
|
||||
(-map
|
||||
(lambda (arg)
|
||||
(setq path (f-expand arg path)))
|
||||
args)
|
||||
(if relative (f-relative path) path)))
|
||||
|
||||
(defun f-split (path)
|
||||
"Split PATH and return list containing parts."
|
||||
(let ((parts (s-split (f-path-separator) path 'omit-nulls)))
|
||||
(if (f-absolute? path)
|
||||
(push (f-path-separator) parts)
|
||||
parts)))
|
||||
|
||||
(defun f-expand (path &optional dir)
|
||||
"Expand PATH relative to DIR (or `default-directory').
|
||||
PATH and DIR can be either a directory names or directory file
|
||||
names. Return a directory name if PATH is a directory name, and
|
||||
a directory file name otherwise. File name handlers are
|
||||
ignored."
|
||||
(let (file-name-handler-alist)
|
||||
(expand-file-name path dir)))
|
||||
|
||||
(defun f-filename (path)
|
||||
"Return the name of PATH."
|
||||
(file-name-nondirectory (directory-file-name path)))
|
||||
|
||||
(defalias 'f-parent 'f-dirname)
|
||||
(defun f-dirname (path)
|
||||
"Return the parent directory to PATH."
|
||||
(let ((parent (file-name-directory
|
||||
(directory-file-name (f-expand path default-directory)))))
|
||||
(unless (f-same? path parent)
|
||||
(if (f-relative? path)
|
||||
(f-relative parent)
|
||||
(directory-file-name parent)))))
|
||||
|
||||
(defun f-common-parent (paths)
|
||||
"Return the deepest common parent directory of PATHS."
|
||||
(cond
|
||||
((not paths) nil)
|
||||
((not (cdr paths)) (f-parent (car paths)))
|
||||
(:otherwise
|
||||
(let* ((paths (-map 'f-split paths))
|
||||
(common (caar paths))
|
||||
(re nil))
|
||||
(while (and (not (null (car paths))) (--all? (equal (car it) common) paths))
|
||||
(setq paths (-map 'cdr paths))
|
||||
(push common re)
|
||||
(setq common (caar paths)))
|
||||
(cond
|
||||
((null re) "")
|
||||
((and (= (length re) 1) (f-root? (car re)))
|
||||
(f-root))
|
||||
(:otherwise
|
||||
(concat (apply 'f-join (nreverse re)) "/")))))))
|
||||
|
||||
(defun f-ext (path)
|
||||
"Return the file extension of PATH.
|
||||
|
||||
The extension, in a file name, is the part that follows the last
|
||||
'.', excluding version numbers and backup suffixes."
|
||||
(file-name-extension path))
|
||||
|
||||
(defun f-no-ext (path)
|
||||
"Return everything but the file extension of PATH."
|
||||
(file-name-sans-extension path))
|
||||
|
||||
(defun f-swap-ext (path ext)
|
||||
"Return PATH but with EXT as the new extension.
|
||||
EXT must not be nil or empty."
|
||||
(if (s-blank? ext)
|
||||
(error "Extension cannot be empty or nil")
|
||||
(concat (f-no-ext path) "." ext)))
|
||||
|
||||
(defun f-base (path)
|
||||
"Return the name of PATH, excluding the extension of file."
|
||||
(f-no-ext (f-filename path)))
|
||||
|
||||
(defun f-relative (path &optional dir)
|
||||
"Return PATH relative to DIR."
|
||||
(file-relative-name path dir))
|
||||
|
||||
(defalias 'f-abbrev 'f-short)
|
||||
(defun f-short (path)
|
||||
"Return abbrev of PATH. See `abbreviate-file-name'."
|
||||
(abbreviate-file-name path))
|
||||
|
||||
(defun f-long (path)
|
||||
"Return long version of PATH."
|
||||
(f-expand path))
|
||||
|
||||
(defun f-canonical (path)
|
||||
"Return the canonical name of PATH."
|
||||
(file-truename path))
|
||||
|
||||
(defun f-slash (path)
|
||||
"Append slash to PATH unless one already.
|
||||
|
||||
Some functions, such as `call-process' requires there to be an
|
||||
ending slash."
|
||||
(if (f-dir? path)
|
||||
(file-name-as-directory path)
|
||||
path))
|
||||
|
||||
(defun f-full (path)
|
||||
"Return absolute path to PATH, with ending slash."
|
||||
(f-slash (f-long path)))
|
||||
|
||||
(defun f--uniquify (paths)
|
||||
"Helper for `f-uniquify' and `f-uniquify-alist'."
|
||||
(let* ((files-length (length paths))
|
||||
(uniq-filenames (--map (cons it (f-filename it)) paths))
|
||||
(uniq-filenames-next (-group-by 'cdr uniq-filenames)))
|
||||
(while (/= files-length (length uniq-filenames-next))
|
||||
(setq uniq-filenames-next
|
||||
(-group-by 'cdr
|
||||
(--mapcat
|
||||
(let ((conf-files (cdr it)))
|
||||
(if (> (length conf-files) 1)
|
||||
(--map (cons (car it) (concat (f-filename (s-chop-suffix (cdr it) (car it))) (f-path-separator) (cdr it))) conf-files)
|
||||
conf-files))
|
||||
uniq-filenames-next))))
|
||||
uniq-filenames-next))
|
||||
|
||||
(defun f-uniquify (files)
|
||||
"Return unique suffixes of FILES.
|
||||
|
||||
This function expects no duplicate paths."
|
||||
(-map 'car (f--uniquify files)))
|
||||
|
||||
(defun f-uniquify-alist (files)
|
||||
"Return alist mapping FILES to unique suffixes of FILES.
|
||||
|
||||
This function expects no duplicate paths."
|
||||
(-map 'cadr (f--uniquify files)))
|
||||
|
||||
|
||||
;;;; I/O
|
||||
|
||||
(defun f-read-bytes (path)
|
||||
"Read binary data from PATH.
|
||||
|
||||
Return the binary data as unibyte string."
|
||||
(with-temp-buffer
|
||||
(set-buffer-multibyte nil)
|
||||
(setq buffer-file-coding-system 'binary)
|
||||
(insert-file-contents-literally path)
|
||||
(buffer-substring-no-properties (point-min) (point-max))))
|
||||
|
||||
(defalias 'f-read 'f-read-text)
|
||||
(defun f-read-text (path &optional coding)
|
||||
"Read text with PATH, using CODING.
|
||||
|
||||
CODING defaults to `utf-8'.
|
||||
|
||||
Return the decoded text as multibyte string."
|
||||
(decode-coding-string (f-read-bytes path) (or coding 'utf-8)))
|
||||
|
||||
(defalias 'f-write 'f-write-text)
|
||||
(defun f-write-text (text coding path)
|
||||
"Write TEXT with CODING to PATH.
|
||||
|
||||
TEXT is a multibyte string. CODING is a coding system to encode
|
||||
TEXT with. PATH is a file name to write to."
|
||||
(f-write-bytes (encode-coding-string text coding) path))
|
||||
|
||||
(defun f-unibyte-string-p (s)
|
||||
"Determine whether S is a unibyte string."
|
||||
(not (multibyte-string-p s)))
|
||||
|
||||
(defun f-write-bytes (data path)
|
||||
"Write binary DATA to PATH.
|
||||
|
||||
DATA is a unibyte string. PATH is a file name to write to."
|
||||
(f--write-bytes data path nil))
|
||||
|
||||
(defalias 'f-append 'f-append-text)
|
||||
(defun f-append-text (text coding path)
|
||||
"Append TEXT with CODING to PATH.
|
||||
|
||||
If PATH does not exist, it is created."
|
||||
(f-append-bytes (encode-coding-string text coding) path))
|
||||
|
||||
(defun f-append-bytes (data path)
|
||||
"Append binary DATA to PATH.
|
||||
|
||||
If PATH does not exist, it is created."
|
||||
(f--write-bytes data path :append))
|
||||
|
||||
(defun f--write-bytes (data filename append)
|
||||
"Write binary DATA to FILENAME.
|
||||
If APPEND is non-nil, append the DATA to the existing contents."
|
||||
(f--destructive filename
|
||||
(unless (f-unibyte-string-p data)
|
||||
(signal 'wrong-type-argument (list 'f-unibyte-string-p data)))
|
||||
(let ((coding-system-for-write 'binary)
|
||||
(write-region-annotate-functions nil)
|
||||
(write-region-post-annotation-function nil))
|
||||
(write-region data nil filename append :silent)
|
||||
nil)))
|
||||
|
||||
|
||||
;;;; Destructive
|
||||
|
||||
(defun f-mkdir (&rest dirs)
|
||||
"Create directories DIRS."
|
||||
(let (path)
|
||||
(-each
|
||||
dirs
|
||||
(lambda (dir)
|
||||
(setq path (f-expand dir path))
|
||||
(unless (f-directory? path)
|
||||
(f--destructive path (make-directory path)))))))
|
||||
|
||||
(defun f-delete (path &optional force)
|
||||
"Delete PATH, which can be file or directory.
|
||||
|
||||
If FORCE is t, a directory will be deleted recursively."
|
||||
(f--destructive path
|
||||
(if (or (f-file? path) (f-symlink? path))
|
||||
(delete-file path)
|
||||
(delete-directory path force))))
|
||||
|
||||
(defun f-symlink (source path)
|
||||
"Create a symlink to SOURCE from PATH."
|
||||
(f--destructive path (make-symbolic-link source path)))
|
||||
|
||||
(defun f-move (from to)
|
||||
"Move or rename FROM to TO.
|
||||
If TO is a directory name, move FROM into TO."
|
||||
(f--destructive to (rename-file from to t)))
|
||||
|
||||
(defun f-copy (from to)
|
||||
"Copy file or directory FROM to TO.
|
||||
If FROM names a directory and TO is a directory name, copy FROM
|
||||
into TO as a subdirectory."
|
||||
(f--destructive to
|
||||
(if (f-file? from)
|
||||
(copy-file from to)
|
||||
;; The behavior of `copy-directory' differs between Emacs 23 and
|
||||
;; 24 in that in Emacs 23, the contents of `from' is copied to
|
||||
;; `to', while in Emacs 24 the directory `from' is copied to
|
||||
;; `to'. We want the Emacs 24 behavior.
|
||||
(if (> emacs-major-version 23)
|
||||
(copy-directory from to)
|
||||
(if (f-dir? to)
|
||||
(progn
|
||||
(apply 'f-mkdir (f-split to))
|
||||
(let ((new-to (f-expand (f-filename from) to)))
|
||||
(copy-directory from new-to)))
|
||||
(copy-directory from to))))))
|
||||
|
||||
(defun f-copy-contents (from to)
|
||||
"Copy contents in directory FROM, to directory TO."
|
||||
(unless (f-exists? to)
|
||||
(error "Cannot copy contents to non existing directory %s" to))
|
||||
(unless (f-dir? from)
|
||||
(error "Cannot copy contents as %s is a file" from))
|
||||
(--each (f-entries from)
|
||||
(f-copy it (file-name-as-directory to))))
|
||||
|
||||
(defun f-touch (path)
|
||||
"Update PATH last modification date or create if it does not exist."
|
||||
(f--destructive path
|
||||
(if (f-file? path)
|
||||
(set-file-times path)
|
||||
(f-write-bytes "" path))))
|
||||
|
||||
|
||||
;;;; Predicates
|
||||
|
||||
(defun f-exists? (path)
|
||||
"Return t if PATH exists, false otherwise."
|
||||
(file-exists-p path))
|
||||
|
||||
(defalias 'f-exists-p 'f-exists?)
|
||||
|
||||
(defalias 'f-dir? 'f-directory?)
|
||||
(defalias 'f-dir-p 'f-dir?)
|
||||
|
||||
(defun f-directory? (path)
|
||||
"Return t if PATH is directory, false otherwise."
|
||||
(file-directory-p path))
|
||||
|
||||
(defalias 'f-directory-p 'f-directory?)
|
||||
|
||||
(defun f-file? (path)
|
||||
"Return t if PATH is file, false otherwise."
|
||||
(file-regular-p path))
|
||||
|
||||
(defalias 'f-file-p 'f-file?)
|
||||
|
||||
(defun f-symlink? (path)
|
||||
"Return t if PATH is symlink, false otherwise."
|
||||
(not (not (file-symlink-p path))))
|
||||
|
||||
(defalias 'f-symlink-p 'f-symlink?)
|
||||
|
||||
(defun f-readable? (path)
|
||||
"Return t if PATH is readable, false otherwise."
|
||||
(file-readable-p path))
|
||||
|
||||
(defalias 'f-readable-p 'f-readable?)
|
||||
|
||||
(defun f-writable? (path)
|
||||
"Return t if PATH is writable, false otherwise."
|
||||
(file-writable-p path))
|
||||
|
||||
(defalias 'f-writable-p 'f-writable?)
|
||||
|
||||
(defun f-executable? (path)
|
||||
"Return t if PATH is executable, false otherwise."
|
||||
(file-executable-p path))
|
||||
|
||||
(defalias 'f-executable-p 'f-executable?)
|
||||
|
||||
(defun f-absolute? (path)
|
||||
"Return t if PATH is absolute, false otherwise."
|
||||
(file-name-absolute-p path))
|
||||
|
||||
(defalias 'f-absolute-p 'f-absolute?)
|
||||
|
||||
(defun f-relative? (path)
|
||||
"Return t if PATH is relative, false otherwise."
|
||||
(not (f-absolute? path)))
|
||||
|
||||
(defalias 'f-relative-p 'f-relative?)
|
||||
|
||||
(defun f-root? (path)
|
||||
"Return t if PATH is root directory, false otherwise."
|
||||
(not (f-parent path)))
|
||||
|
||||
(defalias 'f-root-p 'f-root?)
|
||||
|
||||
(defun f-ext? (path &optional ext)
|
||||
"Return t if extension of PATH is EXT, false otherwise.
|
||||
|
||||
If EXT is nil or omitted, return t if PATH has any extension,
|
||||
false otherwise.
|
||||
|
||||
The extension, in a file name, is the part that follows the last
|
||||
'.', excluding version numbers and backup suffixes."
|
||||
(if ext
|
||||
(string= (f-ext path) ext)
|
||||
(not (eq (f-ext path) nil))))
|
||||
|
||||
(defalias 'f-ext-p 'f-ext?)
|
||||
|
||||
(defalias 'f-equal? 'f-same?)
|
||||
(defalias 'f-equal-p 'f-equal?)
|
||||
|
||||
(defun f-same? (path-a path-b)
|
||||
"Return t if PATH-A and PATH-B are references to same file."
|
||||
(when (and (f-exists? path-a)
|
||||
(f-exists? path-b))
|
||||
(equal
|
||||
(f-canonical (directory-file-name (f-expand path-a)))
|
||||
(f-canonical (directory-file-name (f-expand path-b))))))
|
||||
|
||||
(defalias 'f-same-p 'f-same?)
|
||||
|
||||
(defun f-parent-of? (path-a path-b)
|
||||
"Return t if PATH-A is parent of PATH-B."
|
||||
(--when-let (f-parent path-b)
|
||||
(f-same? path-a it)))
|
||||
|
||||
(defalias 'f-parent-of-p 'f-parent-of?)
|
||||
|
||||
(defun f-child-of? (path-a path-b)
|
||||
"Return t if PATH-A is child of PATH-B."
|
||||
(--when-let (f-parent path-a)
|
||||
(f-same? it path-b)))
|
||||
|
||||
(defalias 'f-child-of-p 'f-child-of?)
|
||||
|
||||
(defun f-ancestor-of? (path-a path-b)
|
||||
"Return t if PATH-A is ancestor of PATH-B."
|
||||
(unless (f-same? path-a path-b)
|
||||
(s-starts-with? (f-full path-a)
|
||||
(f-full path-b))))
|
||||
|
||||
(defalias 'f-ancestor-of-p 'f-ancestor-of?)
|
||||
|
||||
(defun f-descendant-of? (path-a path-b)
|
||||
"Return t if PATH-A is desendant of PATH-B."
|
||||
(unless (f-same? path-a path-b)
|
||||
(s-starts-with? (f-full path-b)
|
||||
(f-full path-a))))
|
||||
|
||||
(defalias 'f-descendant-of-p 'f-descendant-of?)
|
||||
|
||||
(defun f-hidden? (path)
|
||||
"Return t if PATH is hidden, nil otherwise."
|
||||
(unless (f-exists? path)
|
||||
(error "Path does not exist: %s" path))
|
||||
(string= (substring path 0 1) "."))
|
||||
|
||||
(defalias 'f-hidden-p 'f-hidden?)
|
||||
|
||||
(defun f-empty? (path)
|
||||
"If PATH is a file, return t if the file in PATH is empty, nil otherwise.
|
||||
If PATH is directory, return t if directory has no files, nil otherwise."
|
||||
(if (f-directory? path)
|
||||
(equal (f-files path nil t) nil)
|
||||
(= (f-size path) 0)))
|
||||
|
||||
(defalias 'f-empty-p 'f-empty?)
|
||||
|
||||
|
||||
;;;; Stats
|
||||
|
||||
(defun f-size (path)
|
||||
"Return size of PATH.
|
||||
|
||||
If PATH is a file, return size of that file. If PATH is
|
||||
directory, return sum of all files in PATH."
|
||||
(if (f-directory? path)
|
||||
(-sum (-map 'f-size (f-files path nil t)))
|
||||
(nth 7 (file-attributes path))))
|
||||
|
||||
(defun f-depth (path)
|
||||
"Return the depth of PATH.
|
||||
|
||||
At first, PATH is expanded with `f-expand'. Then the full path is used to
|
||||
detect the depth.
|
||||
'/' will be zero depth, '/usr' will be one depth. And so on."
|
||||
(- (length (f-split (f-expand path))) 1))
|
||||
|
||||
|
||||
;;;; Misc
|
||||
|
||||
(defun f-this-file ()
|
||||
"Return path to this file."
|
||||
(cond
|
||||
(load-in-progress load-file-name)
|
||||
((and (boundp 'byte-compile-current-file) byte-compile-current-file)
|
||||
byte-compile-current-file)
|
||||
(:else (buffer-file-name))))
|
||||
|
||||
(defvar f--path-separator nil
|
||||
"A variable to cache result of `f-path-separator'.")
|
||||
|
||||
(defun f-path-separator ()
|
||||
"Return path separator."
|
||||
(or f--path-separator
|
||||
(setq f--path-separator (substring (f-join "x" "y") 1 2))))
|
||||
|
||||
(defun f-glob (pattern &optional path)
|
||||
"Find PATTERN in PATH."
|
||||
(file-expand-wildcards
|
||||
(f-join (or path default-directory) pattern)))
|
||||
|
||||
(defun f--collect-entries (path recursive)
|
||||
(let (result
|
||||
(entries
|
||||
(-reject
|
||||
(lambda (file)
|
||||
(or
|
||||
(equal (f-filename file) ".")
|
||||
(equal (f-filename file) "..")))
|
||||
(directory-files path t))))
|
||||
(cond (recursive
|
||||
(-map
|
||||
(lambda (entry)
|
||||
(if (f-file? entry)
|
||||
(setq result (cons entry result))
|
||||
(when (f-directory? entry)
|
||||
(setq result (cons entry result))
|
||||
(setq result (append result (f--collect-entries entry recursive))))))
|
||||
entries))
|
||||
(t (setq result entries)))
|
||||
result))
|
||||
|
||||
(defmacro f--entries (path body &optional recursive)
|
||||
"Anaphoric version of `f-entries'."
|
||||
`(f-entries
|
||||
,path
|
||||
(lambda (path)
|
||||
(let ((it path))
|
||||
,body))
|
||||
,recursive))
|
||||
|
||||
(defun f-entries (path &optional fn recursive)
|
||||
"Find all files and directories in PATH.
|
||||
|
||||
FN - called for each found file and directory. If FN returns a thruthy
|
||||
value, file or directory will be included.
|
||||
RECURSIVE - Search for files and directories recursive."
|
||||
(let ((entries (f--collect-entries path recursive)))
|
||||
(if fn (-select fn entries) entries)))
|
||||
|
||||
(defmacro f--directories (path body &optional recursive)
|
||||
"Anaphoric version of `f-directories'."
|
||||
`(f-directories
|
||||
,path
|
||||
(lambda (path)
|
||||
(let ((it path))
|
||||
,body))
|
||||
,recursive))
|
||||
|
||||
(defun f-directories (path &optional fn recursive)
|
||||
"Find all directories in PATH. See `f-entries'."
|
||||
(let ((directories (-select 'f-directory? (f--collect-entries path recursive))))
|
||||
(if fn (-select fn directories) directories)))
|
||||
|
||||
(defmacro f--files (path body &optional recursive)
|
||||
"Anaphoric version of `f-files'."
|
||||
`(f-files
|
||||
,path
|
||||
(lambda (path)
|
||||
(let ((it path))
|
||||
,body))
|
||||
,recursive))
|
||||
|
||||
(defun f-files (path &optional fn recursive)
|
||||
"Find all files in PATH. See `f-entries'."
|
||||
(let ((files (-select 'f-file? (f--collect-entries path recursive))))
|
||||
(if fn (-select fn files) files)))
|
||||
|
||||
(defmacro f--traverse-upwards (body &optional path)
|
||||
"Anaphoric version of `f-traverse-upwards'."
|
||||
`(f-traverse-upwards
|
||||
(lambda (dir)
|
||||
(let ((it dir))
|
||||
,body))
|
||||
,path))
|
||||
|
||||
(defun f-traverse-upwards (fn &optional path)
|
||||
"Traverse up as long as FN return nil, starting at PATH.
|
||||
|
||||
If FN returns a non-nil value, the path sent as argument to FN is
|
||||
returned. If no function callback return a non-nil value, nil is
|
||||
returned."
|
||||
(unless path
|
||||
(setq path default-directory))
|
||||
(when (f-relative? path)
|
||||
(setq path (f-expand path)))
|
||||
(if (funcall fn path)
|
||||
path
|
||||
(unless (f-root? path)
|
||||
(f-traverse-upwards fn (f-parent path)))))
|
||||
|
||||
(defun f-root ()
|
||||
"Return absolute root."
|
||||
(f-traverse-upwards 'f-root?))
|
||||
|
||||
(defmacro f-with-sandbox (path-or-paths &rest body)
|
||||
"Only allow PATH-OR-PATHS and decendants to be modified in BODY."
|
||||
(declare (indent 1))
|
||||
`(let ((paths (if (listp ,path-or-paths)
|
||||
,path-or-paths
|
||||
(list ,path-or-paths))))
|
||||
(unwind-protect
|
||||
(let ((f--guard-paths paths))
|
||||
,@body)
|
||||
(setq f--guard-paths nil))))
|
||||
|
||||
(provide 'f)
|
||||
|
||||
;;; f.el ends here
|
||||
BIN
elpa/f-20190109.906/f.elc
Normal file
BIN
elpa/f-20190109.906/f.elc
Normal file
Binary file not shown.
259
elpa/flycheck-20191027.1608/flycheck-autoloads.el
Normal file
259
elpa/flycheck-20191027.1608/flycheck-autoloads.el
Normal file
@@ -0,0 +1,259 @@
|
||||
;;; flycheck-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "flycheck" "flycheck.el" (0 0 0 0))
|
||||
;;; Generated autoloads from flycheck.el
|
||||
|
||||
(autoload 'flycheck-manual "flycheck" "\
|
||||
Open the Flycheck manual.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(autoload 'flycheck-mode "flycheck" "\
|
||||
Minor mode for on-the-fly syntax checking.
|
||||
|
||||
When called interactively, toggle `flycheck-mode'. With prefix
|
||||
ARG, enable `flycheck-mode' if ARG is positive, otherwise disable
|
||||
it.
|
||||
|
||||
When called from Lisp, enable `flycheck-mode' if ARG is omitted,
|
||||
nil or positive. If ARG is `toggle', toggle `flycheck-mode'.
|
||||
Otherwise behave as if called interactively.
|
||||
|
||||
In `flycheck-mode' the buffer is automatically syntax-checked
|
||||
using the first suitable syntax checker from `flycheck-checkers'.
|
||||
Use `flycheck-select-checker' to select a checker for the current
|
||||
buffer manually.
|
||||
|
||||
\\{flycheck-mode-map}
|
||||
|
||||
\(fn &optional ARG)" t nil)
|
||||
|
||||
(defvar global-flycheck-mode nil "\
|
||||
Non-nil if Global Flycheck mode is enabled.
|
||||
See the `global-flycheck-mode' command
|
||||
for a description of this minor mode.
|
||||
Setting this variable directly does not take effect;
|
||||
either customize it (see the info node `Easy Customization')
|
||||
or call the function `global-flycheck-mode'.")
|
||||
|
||||
(custom-autoload 'global-flycheck-mode "flycheck" nil)
|
||||
|
||||
(autoload 'global-flycheck-mode "flycheck" "\
|
||||
Toggle Flycheck mode in all buffers.
|
||||
With prefix ARG, enable Global Flycheck mode if ARG is positive;
|
||||
otherwise, disable it. If called from Lisp, enable the mode if
|
||||
ARG is omitted or nil.
|
||||
|
||||
Flycheck mode is enabled in all buffers where
|
||||
`flycheck-mode-on-safe' would do it.
|
||||
See `flycheck-mode' for more information on Flycheck mode.
|
||||
|
||||
\(fn &optional ARG)" t nil)
|
||||
|
||||
(autoload 'flycheck-define-error-level "flycheck" "\
|
||||
Define a new error LEVEL with PROPERTIES.
|
||||
|
||||
The following PROPERTIES constitute an error level:
|
||||
|
||||
`:severity SEVERITY'
|
||||
A number denoting the severity of this level. The higher
|
||||
the number, the more severe is this level compared to other
|
||||
levels. Defaults to 0.
|
||||
|
||||
The severity is used by `flycheck-error-level-<' to
|
||||
determine the ordering of errors according to their levels.
|
||||
|
||||
`:compilation-level LEVEL'
|
||||
|
||||
A number indicating the broad class of messages that errors
|
||||
at this level belong to: one of 0 (info), 1 (warning), or
|
||||
2 or nil (error). Defaults to nil.
|
||||
|
||||
This is used by `flycheck-checker-pattern-to-error-regexp'
|
||||
to map error levels into `compilation-mode''s hierarchy and
|
||||
to get proper highlighting of errors in `compilation-mode'.
|
||||
|
||||
`:overlay-category CATEGORY'
|
||||
A symbol denoting the overlay category to use for error
|
||||
highlight overlays for this level. See Info
|
||||
node `(elisp)Overlay Properties' for more information about
|
||||
overlay categories.
|
||||
|
||||
A category for an error level overlay should at least define
|
||||
the `face' property, for error highlighting. Another useful
|
||||
property for error level categories is `priority', to
|
||||
influence the stacking of multiple error level overlays.
|
||||
|
||||
`:fringe-bitmap BITMAP'
|
||||
A fringe bitmap symbol denoting the bitmap to use for fringe
|
||||
indicators for this level. See Info node `(elisp)Fringe
|
||||
Bitmaps' for more information about fringe bitmaps,
|
||||
including a list of built-in fringe bitmaps.
|
||||
|
||||
`:fringe-face FACE'
|
||||
A face symbol denoting the face to use for fringe indicators
|
||||
for this level.
|
||||
|
||||
`:error-list-face FACE'
|
||||
A face symbol denoting the face to use for messages of this
|
||||
level in the error list. See `flycheck-list-errors'.
|
||||
|
||||
\(fn LEVEL &rest PROPERTIES)" nil nil)
|
||||
|
||||
(function-put 'flycheck-define-error-level 'lisp-indent-function '1)
|
||||
|
||||
(autoload 'flycheck-define-command-checker "flycheck" "\
|
||||
Define SYMBOL as syntax checker to run a command.
|
||||
|
||||
Define SYMBOL as generic syntax checker via
|
||||
`flycheck-define-generic-checker', which uses an external command
|
||||
to check the buffer. SYMBOL and DOCSTRING are the same as for
|
||||
`flycheck-define-generic-checker'.
|
||||
|
||||
In addition to the properties understood by
|
||||
`flycheck-define-generic-checker', the following PROPERTIES
|
||||
constitute a command syntax checker. Unless otherwise noted, all
|
||||
properties are mandatory. Note that the default `:error-filter'
|
||||
of command checkers is `flycheck-sanitize-errors'.
|
||||
|
||||
`:command COMMAND'
|
||||
The command to run for syntax checking.
|
||||
|
||||
COMMAND is a list of the form `(EXECUTABLE [ARG ...])'.
|
||||
|
||||
EXECUTABLE is a string with the executable of this syntax
|
||||
checker. It can be overridden with the variable
|
||||
`flycheck-SYMBOL-executable'. Note that this variable is
|
||||
NOT implicitly defined by this function. Use
|
||||
`flycheck-def-executable-var' to define this variable.
|
||||
|
||||
Each ARG is an argument to the executable, either as string,
|
||||
or as special symbol or form for
|
||||
`flycheck-substitute-argument', which see.
|
||||
|
||||
`:error-patterns PATTERNS'
|
||||
A list of patterns to parse the output of the `:command'.
|
||||
|
||||
Each ITEM in PATTERNS is a list `(LEVEL SEXP ...)', where
|
||||
LEVEL is a Flycheck error level (see
|
||||
`flycheck-define-error-level'), followed by one or more RX
|
||||
`SEXP's which parse an error of that level and extract line,
|
||||
column, file name and the message.
|
||||
|
||||
See `rx' for general information about RX, and
|
||||
`flycheck-rx-to-string' for some special RX forms provided
|
||||
by Flycheck.
|
||||
|
||||
All patterns are applied in the order of declaration to the
|
||||
whole output of the syntax checker. Output already matched
|
||||
by a pattern will not be matched by subsequent patterns. In
|
||||
other words, the first pattern wins.
|
||||
|
||||
This property is optional. If omitted, however, an
|
||||
`:error-parser' is mandatory.
|
||||
|
||||
`:error-parser FUNCTION'
|
||||
A function to parse errors with.
|
||||
|
||||
The function shall accept three arguments OUTPUT CHECKER
|
||||
BUFFER. OUTPUT is the syntax checker output as string,
|
||||
CHECKER the syntax checker that was used, and BUFFER a
|
||||
buffer object representing the checked buffer. The function
|
||||
must return a list of `flycheck-error' objects parsed from
|
||||
OUTPUT.
|
||||
|
||||
This property is optional. If omitted, it defaults to
|
||||
`flycheck-parse-with-patterns'. In this case,
|
||||
`:error-patterns' is mandatory.
|
||||
|
||||
`:standard-input t'
|
||||
Whether to send the buffer contents on standard input.
|
||||
|
||||
If this property is given and has a non-nil value, send the
|
||||
contents of the buffer on standard input.
|
||||
|
||||
Defaults to nil.
|
||||
|
||||
Note that you may not give `:start', `:interrupt', and
|
||||
`:print-doc' for a command checker. You can give a custom
|
||||
`:verify' function, though, whose results will be appended to the
|
||||
default `:verify' function of command checkers.
|
||||
|
||||
\(fn SYMBOL DOCSTRING &rest PROPERTIES)" nil nil)
|
||||
|
||||
(function-put 'flycheck-define-command-checker 'lisp-indent-function '1)
|
||||
|
||||
(function-put 'flycheck-define-command-checker 'doc-string-elt '2)
|
||||
|
||||
(autoload 'flycheck-def-config-file-var "flycheck" "\
|
||||
Define SYMBOL as config file variable for CHECKER, with default FILE-NAME.
|
||||
|
||||
SYMBOL is declared as customizable variable using `defcustom', to
|
||||
provide a configuration file for the given syntax CHECKER.
|
||||
CUSTOM-ARGS are forwarded to `defcustom'.
|
||||
|
||||
FILE-NAME is the initial value of the new variable. If omitted,
|
||||
the default value is nil.
|
||||
|
||||
Use this together with the `config-file' form in the `:command'
|
||||
argument to `flycheck-define-checker'.
|
||||
|
||||
\(fn SYMBOL CHECKER &optional FILE-NAME &rest CUSTOM-ARGS)" nil t)
|
||||
|
||||
(function-put 'flycheck-def-config-file-var 'lisp-indent-function '3)
|
||||
|
||||
(autoload 'flycheck-def-option-var "flycheck" "\
|
||||
Define SYMBOL as option variable with INIT-VALUE for CHECKER.
|
||||
|
||||
SYMBOL is declared as customizable variable using `defcustom', to
|
||||
provide an option for the given syntax CHECKERS (a checker or a
|
||||
list of checkers). INIT-VALUE is the initial value of the
|
||||
variable, and DOCSTRING is its docstring. CUSTOM-ARGS are
|
||||
forwarded to `defcustom'.
|
||||
|
||||
Use this together with the `option', `option-list' and
|
||||
`option-flag' forms in the `:command' argument to
|
||||
`flycheck-define-checker'.
|
||||
|
||||
\(fn SYMBOL INIT-VALUE CHECKERS DOCSTRING &rest CUSTOM-ARGS)" nil t)
|
||||
|
||||
(function-put 'flycheck-def-option-var 'lisp-indent-function '3)
|
||||
|
||||
(function-put 'flycheck-def-option-var 'doc-string-elt '4)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck" '("flycheck-" "list-flycheck-errors" "help-flycheck-checker-d")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "flycheck-buttercup" "flycheck-buttercup.el"
|
||||
;;;;;; (0 0 0 0))
|
||||
;;; Generated autoloads from flycheck-buttercup.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck-buttercup" '("flycheck-buttercup-format-error-list")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil "flycheck-ert" "flycheck-ert.el" (0 0 0 0))
|
||||
;;; Generated autoloads from flycheck-ert.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck-ert" '("flycheck-er")))
|
||||
|
||||
;;;***
|
||||
|
||||
;;;### (autoloads nil nil ("flycheck-pkg.el") (0 0 0 0))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; flycheck-autoloads.el ends here
|
||||
157
elpa/flycheck-20191027.1608/flycheck-buttercup.el
Normal file
157
elpa/flycheck-20191027.1608/flycheck-buttercup.el
Normal file
@@ -0,0 +1,157 @@
|
||||
;;; flycheck-buttercup.el --- Flycheck: Extensions to Buttercup -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2017 Flycheck contributors
|
||||
;; Copyright (C) 2016 Sebastian Wiesner and Flycheck contributors
|
||||
|
||||
;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
|
||||
;; Maintainer: Clément Pit-Claudel <clement.pitclaudel@live.com>
|
||||
;; fmdkdd <fmdkdd@gmail.com>
|
||||
;; Keywords: lisp, tools
|
||||
|
||||
;; This file is not part of GNU Emacs.
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Extensions to Buttercup to write BDD tests for Flycheck.
|
||||
;;
|
||||
;; Buttercup is a BDD testing framework for Emacs, see URL
|
||||
;; `https://github.com/jorgenschaefer/emacs-buttercup/'. Flycheck uses
|
||||
;; Buttercup extensively for new tests.
|
||||
;;
|
||||
;; This library provides extensions to Buttercup to write Specs for Flycheck.
|
||||
;;
|
||||
;; * Custom matchers
|
||||
;;
|
||||
;; (expect 'foo :to-be-local) - Is `foo' a local variable in the current buffer?
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'buttercup)
|
||||
(require 'flycheck)
|
||||
(require 'seq)
|
||||
|
||||
|
||||
;;; Buttercup helpers
|
||||
|
||||
(defun flycheck-buttercup-format-error-list (errors)
|
||||
"Format ERRORS into a human-readable string."
|
||||
(mapconcat (lambda (e) (flycheck-error-format e 'with-file-name))
|
||||
errors "\n"))
|
||||
|
||||
|
||||
;;; Data matchers
|
||||
|
||||
(buttercup-define-matcher :to-be-empty-string (s)
|
||||
(let ((s (funcall s)))
|
||||
(if (equal s "")
|
||||
(cons t (format "Expected %S not be an empty string" s))
|
||||
(cons nil (format "Expected %S to be an empty string" s)))))
|
||||
|
||||
(buttercup-define-matcher :to-match-with-group (re s index match)
|
||||
(let* ((re (funcall re))
|
||||
(s (funcall s))
|
||||
(index (funcall index))
|
||||
(match (funcall match))
|
||||
(matches? (string-match re s))
|
||||
(result (and matches? (match-string index s))))
|
||||
(if (and matches? (equal result match))
|
||||
(cons t (format "Expected %S not to match %S with %S in group %s"
|
||||
re s match index))
|
||||
|
||||
(cons nil (format "Expected %S to match %S with %S in group %s, %s"
|
||||
re s match index
|
||||
(if matches?
|
||||
(format "but got %S" result)
|
||||
"but did not match"))))))
|
||||
|
||||
|
||||
;;; Emacs feature matchers
|
||||
|
||||
(buttercup-define-matcher :to-be-live (buffer)
|
||||
(let ((buffer (get-buffer (funcall buffer))))
|
||||
(if (buffer-live-p buffer)
|
||||
(cons t (format "Expected %S not to be a live buffer, but it is"
|
||||
buffer))
|
||||
(cons nil (format "Expected %S to be a live buffer, but it is not"
|
||||
buffer)))))
|
||||
|
||||
(buttercup-define-matcher :to-be-visible (buffer)
|
||||
(let ((buffer (get-buffer (funcall buffer))))
|
||||
(cond
|
||||
((and buffer (get-buffer-window buffer))
|
||||
(cons t (format "Expected %S not to be a visible buffer, but it is"
|
||||
buffer)))
|
||||
((not (bufferp buffer))
|
||||
(cons nil
|
||||
(format "Expected %S to be a visible buffer, but it is not a buffer"
|
||||
buffer)))
|
||||
(t (cons
|
||||
nil
|
||||
(format "Expected %S to be a visible buffer, but it is not visible"
|
||||
buffer))))))
|
||||
|
||||
(buttercup-define-matcher :to-be-local (symbol)
|
||||
(let ((symbol (funcall symbol)))
|
||||
(if (local-variable-p symbol)
|
||||
(cons t (format "Expected %S not to be a local variable, but it is"
|
||||
symbol))
|
||||
(cons nil (format "Expected %S to be a local variable, but it is not"
|
||||
symbol)))))
|
||||
|
||||
(buttercup-define-matcher :to-contain-match (buffer re)
|
||||
(let ((buffer (funcall buffer))
|
||||
(re (funcall re)))
|
||||
(if (not (get-buffer buffer))
|
||||
(cons nil (format "Expected %S to contain a match of %s, \
|
||||
but is not a buffer" buffer re))
|
||||
(with-current-buffer buffer
|
||||
(save-excursion
|
||||
(goto-char (point-min))
|
||||
(if (re-search-forward re nil 'noerror)
|
||||
(cons t (format "Expected %S to contain a match \
|
||||
for %s, but it did not" buffer re))
|
||||
(cons nil (format "Expected %S not to contain a match for \
|
||||
%s but it did not." buffer re))))))))
|
||||
|
||||
|
||||
;;; Flycheck matchers
|
||||
|
||||
(buttercup-define-matcher :to-be-equal-flycheck-errors (a b)
|
||||
(let* ((a (funcall a))
|
||||
(b (funcall b))
|
||||
(a-formatted (flycheck-buttercup-format-error-list a))
|
||||
(b-formatted (flycheck-buttercup-format-error-list b)))
|
||||
(if (equal a b)
|
||||
(cons t (format "Expected
|
||||
%s
|
||||
not to be equal to
|
||||
%s" a-formatted b-formatted))
|
||||
(cons nil (format "Expected
|
||||
%s
|
||||
to be equal to
|
||||
%s" a-formatted b-formatted)))))
|
||||
|
||||
(provide 'flycheck-buttercup)
|
||||
|
||||
;; Disable byte compilation for this library, to prevent package.el choking on a
|
||||
;; missing `buttercup' library. See
|
||||
;; https://github.com/flycheck/flycheck/issues/860
|
||||
|
||||
;; Local Variables:
|
||||
;; no-byte-compile: t
|
||||
;; End:
|
||||
|
||||
;;; flycheck-buttercup.el ends here
|
||||
483
elpa/flycheck-20191027.1608/flycheck-ert.el
Normal file
483
elpa/flycheck-20191027.1608/flycheck-ert.el
Normal file
@@ -0,0 +1,483 @@
|
||||
;;; flycheck-ert.el --- Flycheck: ERT extensions -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2017-2018 Flycheck contributors
|
||||
;; Copyright (C) 2013-2016 Sebastian Wiesner and Flycheck contributors
|
||||
|
||||
;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
|
||||
;; Maintainer: Clément Pit-Claudel <clement.pitclaudel@live.com>
|
||||
;; fmdkdd <fmdkdd@gmail.com>
|
||||
;; URL: https://github.com/flycheck/flycheck
|
||||
|
||||
;; This file is not part of GNU Emacs.
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; Unit testing library for Flycheck, the modern on-the-fly syntax checking
|
||||
;; extension for GNU Emacs.
|
||||
|
||||
;; Provide various utility functions and unit test helpers to test Flycheck and
|
||||
;; Flycheck extensions.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(require 'flycheck)
|
||||
(require 'ert)
|
||||
(require 'macroexp) ; For macro utilities
|
||||
|
||||
|
||||
;;; Compatibility
|
||||
|
||||
(eval-and-compile
|
||||
;; Provide `ert-skip' and friends for Emacs 24.3
|
||||
(defconst flycheck-ert-ert-can-skip (fboundp 'ert-skip)
|
||||
"Whether ERT supports test skipping.")
|
||||
|
||||
(unless (fboundp 'define-error)
|
||||
;; from Emacs `subr.el'
|
||||
(defun define-error (name message &optional parent)
|
||||
"Define NAME as a new error signal.
|
||||
MESSAGE is a string that will be output to the echo area if such an error
|
||||
is signaled without being caught by a `condition-case'.
|
||||
PARENT is either a signal or a list of signals from which it inherits.
|
||||
Defaults to `error'."
|
||||
(unless parent (setq parent 'error))
|
||||
(let ((conditions
|
||||
(if (consp parent)
|
||||
(apply #'append
|
||||
(mapcar
|
||||
(lambda (parent)
|
||||
(cons parent
|
||||
(or (get parent 'error-conditions)
|
||||
(error "Unknown signal `%s'" parent))))
|
||||
parent))
|
||||
(cons parent (get parent 'error-conditions)))))
|
||||
(put name 'error-conditions
|
||||
(delete-dups (copy-sequence (cons name conditions))))
|
||||
(when message (put name 'error-message message)))))
|
||||
|
||||
(unless flycheck-ert-ert-can-skip
|
||||
;; Fake skipping
|
||||
|
||||
(define-error 'flycheck-ert-skipped "Test skipped")
|
||||
|
||||
(defun ert-skip (data)
|
||||
(signal 'flycheck-ert-skipped data))
|
||||
|
||||
(defmacro skip-unless (form)
|
||||
`(unless (ignore-errors ,form)
|
||||
(signal 'flycheck-ert-skipped ',form)))
|
||||
|
||||
(defun ert-test-skipped-p (result)
|
||||
(and (ert-test-failed-p result)
|
||||
(eq (car (ert-test-failed-condition result))
|
||||
'flycheck-ert-skipped)))))
|
||||
|
||||
|
||||
;;; Internal variables
|
||||
|
||||
(defvar flycheck-ert--resource-directory nil
|
||||
"The directory to get resources from in this test suite.")
|
||||
|
||||
|
||||
;;; Resource management macros
|
||||
|
||||
(defmacro flycheck-ert-with-temp-buffer (&rest body)
|
||||
"Eval BODY within a temporary buffer.
|
||||
|
||||
Like `with-temp-buffer', but resets the modification state of the
|
||||
temporary buffer to make sure that it is properly killed even if
|
||||
it has a backing file and is modified."
|
||||
(declare (indent 0))
|
||||
`(with-temp-buffer
|
||||
(unwind-protect
|
||||
,(macroexp-progn body)
|
||||
;; Reset modification state of the buffer, and unlink it from its backing
|
||||
;; file, if any, because Emacs refuses to kill modified buffers with
|
||||
;; backing files, even if they are temporary.
|
||||
(set-buffer-modified-p nil)
|
||||
(set-visited-file-name nil 'no-query))))
|
||||
|
||||
(defmacro flycheck-ert-with-file-buffer (file-name &rest body)
|
||||
"Create a buffer from FILE-NAME and eval BODY.
|
||||
|
||||
BODY is evaluated with `current-buffer' being a buffer with the
|
||||
contents FILE-NAME."
|
||||
(declare (indent 1))
|
||||
`(let ((file-name ,file-name))
|
||||
(unless (file-exists-p file-name)
|
||||
(error "%s does not exist" file-name))
|
||||
(flycheck-ert-with-temp-buffer
|
||||
(insert-file-contents file-name 'visit)
|
||||
(set-visited-file-name file-name 'no-query)
|
||||
(cd (file-name-directory file-name))
|
||||
;; Mark the buffer as not modified, because we just loaded the file up to
|
||||
;; now.
|
||||
(set-buffer-modified-p nil)
|
||||
,@body)))
|
||||
|
||||
(defmacro flycheck-ert-with-help-buffer (&rest body)
|
||||
"Execute BODY and kill the help buffer afterwards.
|
||||
|
||||
Use this macro to test functions that create a Help buffer."
|
||||
(declare (indent 0))
|
||||
`(unwind-protect
|
||||
,(macroexp-progn body)
|
||||
(when (buffer-live-p (get-buffer (help-buffer)))
|
||||
(kill-buffer (help-buffer)))))
|
||||
|
||||
(defmacro flycheck-ert-with-global-mode (&rest body)
|
||||
"Execute BODY with Global Flycheck Mode enabled.
|
||||
|
||||
After BODY, restore the old state of Global Flycheck Mode."
|
||||
(declare (indent 0))
|
||||
`(let ((old-state global-flycheck-mode))
|
||||
(unwind-protect
|
||||
(progn
|
||||
(global-flycheck-mode 1)
|
||||
,@body)
|
||||
(global-flycheck-mode (if old-state 1 -1)))))
|
||||
|
||||
(defmacro flycheck-ert-with-env (env &rest body)
|
||||
"Add ENV to `process-environment' in BODY.
|
||||
|
||||
Execute BODY with a `process-environment' which contains all
|
||||
variables from ENV added.
|
||||
|
||||
ENV is an alist, where each cons cell `(VAR . VALUE)' is a
|
||||
environment variable VAR to be added to `process-environment'
|
||||
with VALUE."
|
||||
(declare (indent 1))
|
||||
`(let ((process-environment (copy-sequence process-environment)))
|
||||
(pcase-dolist (`(,var . ,value) ,env)
|
||||
(setenv var value))
|
||||
,@body))
|
||||
|
||||
|
||||
;;; Test resources
|
||||
(defun flycheck-ert-resource-filename (resource-file)
|
||||
"Determine the absolute file name of a RESOURCE-FILE.
|
||||
|
||||
Relative file names are expanded against
|
||||
`flycheck-ert--resource-directory'."
|
||||
(expand-file-name resource-file flycheck-ert--resource-directory))
|
||||
|
||||
(defmacro flycheck-ert-with-resource-buffer (resource-file &rest body)
|
||||
"Create a temp buffer from a RESOURCE-FILE and execute BODY.
|
||||
|
||||
The absolute file name of RESOURCE-FILE is determined with
|
||||
`flycheck-ert-resource-filename'."
|
||||
(declare (indent 1))
|
||||
`(flycheck-ert-with-file-buffer
|
||||
(flycheck-ert-resource-filename ,resource-file)
|
||||
,@body))
|
||||
|
||||
|
||||
;;; Test suite initialization
|
||||
|
||||
(defun flycheck-ert-initialize (resource-dir)
|
||||
"Initialize a test suite with RESOURCE-DIR.
|
||||
|
||||
RESOURCE-DIR is the directory, `flycheck-ert-resource-filename'
|
||||
should use to lookup resource files."
|
||||
(when flycheck-ert--resource-directory
|
||||
(error "Test suite already initialized"))
|
||||
(let ((tests (ert-select-tests t t)))
|
||||
;; Select all tests
|
||||
(unless tests
|
||||
(error "No tests defined. \
|
||||
Call `flycheck-ert-initialize' after defining all tests!"))
|
||||
|
||||
(setq flycheck-ert--resource-directory resource-dir)
|
||||
|
||||
;; Emacs 24.3 don't support skipped tests, so we add poor man's test
|
||||
;; skipping: We mark skipped tests as expected failures by adjusting the
|
||||
;; expected result of all test cases. Not particularly pretty, but works :)
|
||||
(unless flycheck-ert-ert-can-skip
|
||||
(dolist (test tests)
|
||||
(let ((result (ert-test-expected-result-type test)))
|
||||
(setf (ert-test-expected-result-type test)
|
||||
`(or ,result (satisfies ert-test-skipped-p))))))))
|
||||
|
||||
|
||||
;;; Test case definitions
|
||||
(defmacro flycheck-ert-def-checker-test (checker language name
|
||||
&rest keys-and-body)
|
||||
"Define a test case for a syntax CHECKER for LANGUAGE.
|
||||
|
||||
CHECKER is a symbol or a list of symbols denoting syntax checkers
|
||||
being tested by the test. The test case is skipped, if any of
|
||||
these checkers cannot be used. LANGUAGE is a symbol or a list of
|
||||
symbols denoting the programming languages supported by the
|
||||
syntax checkers. This is currently only used for tagging the
|
||||
test appropriately.
|
||||
|
||||
NAME is a symbol denoting the local name of the test. The test
|
||||
itself is ultimately named
|
||||
`flycheck-define-checker/CHECKER/NAME'. If CHECKER is a list,
|
||||
the first checker in the list is used for naming the test.
|
||||
|
||||
Optionally, the keyword arguments `:tags' and `:expected-result'
|
||||
may be given. They have the same meaning as in `ert-deftest.',
|
||||
and are added to the tags and result expectations set up by this
|
||||
macro.
|
||||
|
||||
The remaining forms KEYS-AND-BODY denote the body of the test
|
||||
case, including assertions and setup code."
|
||||
(declare (indent 3))
|
||||
(unless checker
|
||||
(error "No syntax checkers specified"))
|
||||
(unless language
|
||||
(error "No languages specified"))
|
||||
(let* ((checkers (if (symbolp checker) (list checker) checker))
|
||||
(checker (car checkers))
|
||||
(languages (if (symbolp language) (list language) language))
|
||||
(language-tags (mapcar (lambda (l) (intern (format "language-%s" l)))
|
||||
languages))
|
||||
(checker-tags (mapcar (lambda (c) (intern (format "checker-%s" c)))
|
||||
checkers))
|
||||
(local-name (or name 'default))
|
||||
(full-name (intern (format "flycheck-define-checker/%s/%s"
|
||||
checker local-name)))
|
||||
(keys-and-body (ert--parse-keys-and-body keys-and-body))
|
||||
(body (cadr keys-and-body))
|
||||
(keys (car keys-and-body))
|
||||
(default-tags '(syntax-checker external-tool)))
|
||||
`(ert-deftest ,full-name ()
|
||||
:expected-result ,(or (plist-get keys :expected-result) :passed)
|
||||
:tags (append ',(append default-tags language-tags checker-tags)
|
||||
,(plist-get keys :tags))
|
||||
,@(mapcar (lambda (c)
|
||||
`(skip-unless
|
||||
;; Ignore non-command checkers
|
||||
(or (not (flycheck-checker-get ',c 'command))
|
||||
(executable-find (flycheck-checker-executable ',c)))))
|
||||
checkers)
|
||||
,@body)))
|
||||
|
||||
|
||||
;;; Test case results
|
||||
|
||||
(defun flycheck-ert-syntax-check-timed-out-p (result)
|
||||
"Whether RESULT denotes a timed-out test.
|
||||
|
||||
RESULT is an ERT test result object."
|
||||
(and (ert-test-failed-p result)
|
||||
(eq (car (ert-test-failed-condition result))
|
||||
'flycheck-ert-syntax-check-timed-out)))
|
||||
|
||||
|
||||
;;; Syntax checking in tests
|
||||
|
||||
(defvar-local flycheck-ert-syntax-checker-finished nil
|
||||
"Non-nil if the current checker has finished.")
|
||||
|
||||
(add-hook 'flycheck-after-syntax-check-hook
|
||||
(lambda () (setq flycheck-ert-syntax-checker-finished t)))
|
||||
|
||||
(defconst flycheck-ert-checker-wait-time 10
|
||||
"Time to wait until a checker is finished in seconds.
|
||||
|
||||
After this time has elapsed, the checker is considered to have
|
||||
failed, and the test aborted with failure.")
|
||||
|
||||
(define-error 'flycheck-ert-syntax-check-timed-out "Syntax check timed out.")
|
||||
|
||||
(defun flycheck-ert-wait-for-syntax-checker ()
|
||||
"Wait until the syntax check in the current buffer is finished."
|
||||
(let ((starttime (float-time)))
|
||||
(while (and (not flycheck-ert-syntax-checker-finished)
|
||||
(< (- (float-time) starttime) flycheck-ert-checker-wait-time))
|
||||
(sleep-for 1))
|
||||
(unless (< (- (float-time) starttime) flycheck-ert-checker-wait-time)
|
||||
(flycheck-stop)
|
||||
(signal 'flycheck-ert-syntax-check-timed-out nil)))
|
||||
(setq flycheck-ert-syntax-checker-finished nil))
|
||||
|
||||
(defun flycheck-ert-buffer-sync ()
|
||||
"Like `flycheck-buffer', but synchronously."
|
||||
(setq flycheck-ert-syntax-checker-finished nil)
|
||||
(should (not (flycheck-running-p)))
|
||||
(flycheck-mode) ; This will only start a deferred check,
|
||||
(flycheck-buffer) ; so we need an explicit manual check
|
||||
;; After starting the check, the checker should either be running now, or
|
||||
;; already be finished (if it was fast).
|
||||
(should (or flycheck-current-syntax-check
|
||||
flycheck-ert-syntax-checker-finished))
|
||||
;; Also there should be no deferred check pending anymore
|
||||
(should-not (flycheck-deferred-check-p))
|
||||
(flycheck-ert-wait-for-syntax-checker))
|
||||
|
||||
(defun flycheck-ert-ensure-clear ()
|
||||
"Clear the current buffer.
|
||||
|
||||
Raise an assertion error if the buffer is not clear afterwards."
|
||||
(flycheck-clear)
|
||||
(should (not flycheck-current-errors))
|
||||
(should (not (-any? (lambda (ov) (overlay-get ov 'flycheck-overlay))
|
||||
(overlays-in (point-min) (point-max))))))
|
||||
|
||||
|
||||
;;; Test assertions
|
||||
|
||||
(defun flycheck-error-without-group (err)
|
||||
"Return a copy ERR with the `group' property set to nil."
|
||||
(let ((copy (copy-flycheck-error err)))
|
||||
(setf (flycheck-error-group copy) nil)
|
||||
copy))
|
||||
|
||||
(defun flycheck-ert-should-overlay (error)
|
||||
"Test that ERROR has a proper overlay in the current buffer.
|
||||
|
||||
ERROR is a Flycheck error object."
|
||||
(let* ((overlay (-first (lambda (ov)
|
||||
(equal (flycheck-error-without-group
|
||||
(overlay-get ov 'flycheck-error))
|
||||
(flycheck-error-without-group error)))
|
||||
(flycheck-overlays-in 0 (+ 1 (buffer-size)))))
|
||||
(region
|
||||
;; Overlays of errors from other files are on the first line
|
||||
(if (flycheck-relevant-error-other-file-p error)
|
||||
(cons (point-min)
|
||||
(save-excursion (goto-char (point-min)) (point-at-eol)))
|
||||
(flycheck-error-region-for-mode error 'symbols)))
|
||||
(level (flycheck-error-level error))
|
||||
(category (flycheck-error-level-overlay-category level))
|
||||
(face (get category 'face))
|
||||
(fringe-bitmap (flycheck-error-level-fringe-bitmap level))
|
||||
(fringe-face (flycheck-error-level-fringe-face level))
|
||||
(fringe-icon (list 'left-fringe fringe-bitmap fringe-face)))
|
||||
(should overlay)
|
||||
(should (overlay-get overlay 'flycheck-overlay))
|
||||
(should (= (overlay-start overlay) (car region)))
|
||||
(should (= (overlay-end overlay) (cdr region)))
|
||||
(should (eq (overlay-get overlay 'face) face))
|
||||
(should (equal (get-char-property 0 'display
|
||||
(overlay-get overlay 'before-string))
|
||||
fringe-icon))
|
||||
(should (eq (overlay-get overlay 'category) category))
|
||||
(should (equal (flycheck-error-without-group (overlay-get overlay
|
||||
'flycheck-error))
|
||||
(flycheck-error-without-group error)))))
|
||||
|
||||
(defun flycheck-ert-should-errors (&rest errors)
|
||||
"Test that the current buffers has ERRORS.
|
||||
|
||||
ERRORS is a list of errors expected to be present in the current
|
||||
buffer. Each error is given as a list of arguments to
|
||||
`flycheck-error-new-at'.
|
||||
|
||||
If ERRORS are omitted, test that there are no errors at all in
|
||||
the current buffer.
|
||||
|
||||
With ERRORS, test that each error in ERRORS is present in the
|
||||
current buffer, and that the number of errors in the current
|
||||
buffer is equal to the number of given ERRORS. In other words,
|
||||
check that the buffer has all ERRORS, and no other errors."
|
||||
(let ((expected (mapcar (apply-partially #'apply #'flycheck-error-new-at)
|
||||
errors)))
|
||||
(should (equal (mapcar #'flycheck-error-without-group expected)
|
||||
(mapcar #'flycheck-error-without-group
|
||||
flycheck-current-errors)))
|
||||
;; Check that related errors are the same
|
||||
(cl-mapcar (lambda (err1 err2)
|
||||
(should (equal (mapcar #'flycheck-error-without-group
|
||||
(flycheck-related-errors err1 expected))
|
||||
(mapcar #'flycheck-error-without-group
|
||||
(flycheck-related-errors err2)))))
|
||||
expected flycheck-current-errors)
|
||||
(mapc #'flycheck-ert-should-overlay expected))
|
||||
(should (= (length errors)
|
||||
(length (flycheck-overlays-in (point-min) (point-max))))))
|
||||
|
||||
(define-error 'flycheck-ert-suspicious-checker "Suspicious state from checker")
|
||||
|
||||
(defun flycheck-ert-should-syntax-check (resource-file modes &rest errors)
|
||||
"Test a syntax check in RESOURCE-FILE with MODES.
|
||||
|
||||
RESOURCE-FILE is the file to check. MODES is a single major mode
|
||||
symbol or a list thereof, specifying the major modes to syntax
|
||||
check with. If more than one major mode is specified, the test
|
||||
is run for each mode separately, so if you give three major
|
||||
modes, the entire test will run three times. ERRORS is the list
|
||||
of expected errors, as in `flycheck-ert-should-errors'. If
|
||||
omitted, the syntax check must not emit any errors. The errors
|
||||
are cleared after each test.
|
||||
|
||||
The syntax checker is selected via standard syntax checker
|
||||
selection. To test a specific checker, you need to set
|
||||
`flycheck-checker' or `flycheck-disabled-checkers' accordingly
|
||||
before using this predicate, depending on whether you want to use
|
||||
manual or automatic checker selection.
|
||||
|
||||
During the syntax check, configuration files of syntax checkers
|
||||
are also searched in the `config-files' sub-directory of the
|
||||
resource directory."
|
||||
(when (symbolp modes)
|
||||
(setq modes (list modes)))
|
||||
(dolist (mode modes)
|
||||
(unless (fboundp mode)
|
||||
(ert-skip (format "%S missing" mode)))
|
||||
(flycheck-ert-with-resource-buffer resource-file
|
||||
(funcall mode)
|
||||
;; Load safe file-local variables because some tests depend on them
|
||||
(let ((enable-local-variables :safe)
|
||||
;; Disable all hooks at this place, to prevent 3rd party packages
|
||||
;; from interfering
|
||||
(hack-local-variables-hook))
|
||||
(hack-local-variables))
|
||||
;; Configure config file locating for unit tests
|
||||
(let ((process-hook-called 0))
|
||||
(add-hook 'flycheck-process-error-functions
|
||||
(lambda (_err)
|
||||
(setq process-hook-called (1+ process-hook-called))
|
||||
nil)
|
||||
nil :local)
|
||||
(add-hook 'flycheck-status-changed-functions
|
||||
(lambda (status)
|
||||
(when (eq status 'suspicious)
|
||||
(signal 'flycheck-ert-suspicious-checker nil))))
|
||||
(flycheck-ert-buffer-sync)
|
||||
(apply #'flycheck-ert-should-errors errors)
|
||||
(should (= process-hook-called (length errors))))
|
||||
(flycheck-ert-ensure-clear))))
|
||||
|
||||
(defun flycheck-ert-at-nth-error (n)
|
||||
"Determine whether point is at the N'th Flycheck error.
|
||||
|
||||
Return non-nil if the point is at the N'th Flycheck error in the
|
||||
current buffer. Otherwise return nil."
|
||||
(let* ((error (nth (1- n) flycheck-current-errors))
|
||||
(mode flycheck-highlighting-mode)
|
||||
(region (flycheck-error-region-for-mode error mode)))
|
||||
(and (member error (flycheck-overlay-errors-at (point)))
|
||||
(= (point) (car region)))))
|
||||
|
||||
(defun flycheck-ert-explain--at-nth-error (n)
|
||||
"Explain a failed at-nth-error predicate at N."
|
||||
(let ((errors (flycheck-overlay-errors-at (point))))
|
||||
(if (null errors)
|
||||
(format "Expected to be at error %s, but no error at point %s"
|
||||
n (point))
|
||||
(let ((pos (cl-position (car errors) flycheck-current-errors)))
|
||||
(format "Expected to be at error %s, but point %s is at error %s"
|
||||
n (point) (1+ pos))))))
|
||||
|
||||
(put 'flycheck-ert-at-nth-error 'ert-explainer
|
||||
'flycheck-ert-explain--at-nth-error)
|
||||
|
||||
(provide 'flycheck-ert)
|
||||
|
||||
;;; flycheck-ert.el ends here
|
||||
BIN
elpa/flycheck-20191027.1608/flycheck-ert.elc
Normal file
BIN
elpa/flycheck-20191027.1608/flycheck-ert.elc
Normal file
Binary file not shown.
16
elpa/flycheck-20191027.1608/flycheck-pkg.el
Normal file
16
elpa/flycheck-20191027.1608/flycheck-pkg.el
Normal file
@@ -0,0 +1,16 @@
|
||||
(define-package "flycheck" "20191027.1608" "On-the-fly syntax checking"
|
||||
'((dash "2.12.1")
|
||||
(pkg-info "0.4")
|
||||
(let-alist "1.0.4")
|
||||
(seq "1.11")
|
||||
(emacs "24.3"))
|
||||
:keywords
|
||||
'("convenience" "languages" "tools")
|
||||
:authors
|
||||
'(("Sebastian Wiesner" . "swiesner@lunaryorn.com"))
|
||||
:maintainer
|
||||
'("Clément Pit-Claudel" . "clement.pitclaudel@live.com")
|
||||
:url "http://www.flycheck.org")
|
||||
;; Local Variables:
|
||||
;; no-byte-compile: t
|
||||
;; End:
|
||||
11256
elpa/flycheck-20191027.1608/flycheck.el
Normal file
11256
elpa/flycheck-20191027.1608/flycheck.el
Normal file
File diff suppressed because it is too large
Load Diff
BIN
elpa/flycheck-20191027.1608/flycheck.elc
Normal file
BIN
elpa/flycheck-20191027.1608/flycheck.elc
Normal file
Binary file not shown.
30
elpa/flycheck-rust-20190319.1546/flycheck-rust-autoloads.el
Normal file
30
elpa/flycheck-rust-20190319.1546/flycheck-rust-autoloads.el
Normal file
@@ -0,0 +1,30 @@
|
||||
;;; flycheck-rust-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "flycheck-rust" "flycheck-rust.el" (0 0 0 0))
|
||||
;;; Generated autoloads from flycheck-rust.el
|
||||
|
||||
(autoload 'flycheck-rust-setup "flycheck-rust" "\
|
||||
Setup Rust in Flycheck.
|
||||
|
||||
If the current file is part of a Cargo project, configure
|
||||
Flycheck according to the Cargo project layout.
|
||||
|
||||
\(fn)" t nil)
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "flycheck-rust" '("flycheck-rust-")))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; flycheck-rust-autoloads.el ends here
|
||||
2
elpa/flycheck-rust-20190319.1546/flycheck-rust-pkg.el
Normal file
2
elpa/flycheck-rust-20190319.1546/flycheck-rust-pkg.el
Normal file
@@ -0,0 +1,2 @@
|
||||
;;; -*- no-byte-compile: t -*-
|
||||
(define-package "flycheck-rust" "20190319.1546" "Flycheck: Rust additions and Cargo support" '((emacs "24.1") (flycheck "28") (dash "2.13.0") (seq "2.3") (let-alist "1.0.4")) :commit "a139cd53c5062697e9ed94ad80b803c37d999600" :keywords '("tools" "convenience") :authors '(("Sebastian Wiesner" . "swiesner@lunaryorn.com")) :maintainer '("Sebastian Wiesner" . "swiesner@lunaryorn.com") :url "https://github.com/flycheck/flycheck-rust")
|
||||
210
elpa/flycheck-rust-20190319.1546/flycheck-rust.el
Normal file
210
elpa/flycheck-rust-20190319.1546/flycheck-rust.el
Normal file
@@ -0,0 +1,210 @@
|
||||
;;; flycheck-rust.el --- Flycheck: Rust additions and Cargo support -*- lexical-binding: t; -*-
|
||||
|
||||
;; Copyright (C) 2016, 2017 fmdkdd
|
||||
;; Copyright (C) 2014, 2015 Sebastian Wiesner <swiesner@lunaryorn.com>
|
||||
|
||||
;; Author: Sebastian Wiesner <swiesner@lunaryorn.com>
|
||||
;; URL: https://github.com/flycheck/flycheck-rust
|
||||
;; Package-Version: 20190319.1546
|
||||
;; Keywords: tools, convenience
|
||||
;; Version: 1.1
|
||||
;; Package-Requires: ((emacs "24.1") (flycheck "28") (dash "2.13.0") (seq "2.3") (let-alist "1.0.4"))
|
||||
|
||||
;; This file is not part of GNU Emacs.
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; This Flycheck extension configures Flycheck automatically for the current
|
||||
;; Cargo project.
|
||||
;;
|
||||
;; # Setup
|
||||
;;
|
||||
;; (with-eval-after-load 'rust-mode
|
||||
;; (add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
|
||||
;;
|
||||
;; # Usage
|
||||
;;
|
||||
;; Just use Flycheck as usual in your Rust/Cargo projects.
|
||||
|
||||
;;; Code:
|
||||
|
||||
(eval-when-compile
|
||||
(require 'pcase)
|
||||
(require 'let-alist))
|
||||
|
||||
(require 'dash)
|
||||
(require 'flycheck)
|
||||
(require 'seq)
|
||||
(require 'json)
|
||||
|
||||
(defun flycheck-rust-find-manifest (file-name)
|
||||
"Get the Cargo.toml manifest for FILE-NAME.
|
||||
|
||||
FILE-NAME is the path of a file in a cargo project given as a
|
||||
string.
|
||||
|
||||
See http://doc.crates.io/guide.html for an introduction to the
|
||||
Cargo.toml manifest.
|
||||
|
||||
Return the path to the Cargo.toml manifest file, or nil if the
|
||||
manifest could not be located."
|
||||
(-when-let (root-dir (locate-dominating-file file-name "Cargo.toml"))
|
||||
(expand-file-name "Cargo.toml" root-dir)))
|
||||
|
||||
(defun flycheck-rust-dirs-list (start end)
|
||||
"Return a list of directories from START (inclusive) to END (exclusive).
|
||||
|
||||
E.g., if START is '/a/b/c/d' and END is '/a', return the list
|
||||
'(/a/b/c/d /a/b/c /a/b) in this order.
|
||||
|
||||
START and END are strings representing file paths. END should be
|
||||
above START in the file hierarchy; if not, the list stops at the
|
||||
root of the file hierarchy."
|
||||
(let ((dirlist)
|
||||
(dir (expand-file-name start))
|
||||
(end (expand-file-name end)))
|
||||
(while (not (or (equal dir (car dirlist)) ; avoid infinite loop
|
||||
(file-equal-p dir end)))
|
||||
(push dir dirlist)
|
||||
(setq dir (directory-file-name (file-name-directory dir))))
|
||||
(nreverse dirlist)))
|
||||
|
||||
(defun flycheck-rust-get-cargo-targets (manifest)
|
||||
"Return the list of available Cargo targets for the given project.
|
||||
|
||||
MANIFEST is the path to the Cargo.toml file of the project.
|
||||
|
||||
Calls `cargo metadata --no-deps --manifest-path MANIFEST
|
||||
--format-version 1', parses and collects the targets for the
|
||||
current workspace, and returns them in a list, or nil if no
|
||||
targets could be found."
|
||||
(let ((cargo (funcall flycheck-executable-find "cargo")))
|
||||
(unless cargo
|
||||
(user-error "flycheck-rust cannot find `cargo'. Please \
|
||||
make sure that cargo is installed and on your PATH. See \
|
||||
http://www.flycheck.org/en/latest/user/troubleshooting.html for \
|
||||
more information on setting your PATH with Emacs."))
|
||||
;; metadata contains a list of packages, and each package has a list of
|
||||
;; targets. We concatenate all targets, regardless of the package.
|
||||
(-when-let (packages (let-alist
|
||||
(with-temp-buffer
|
||||
(call-process cargo nil '(t nil) nil
|
||||
"metadata" "--no-deps"
|
||||
"--manifest-path" manifest
|
||||
"--format-version" "1")
|
||||
(goto-char (point-min))
|
||||
(let ((json-array-type 'list))
|
||||
(json-read)))
|
||||
.packages))
|
||||
(seq-map (lambda (pkg)
|
||||
(let-alist pkg .targets))
|
||||
packages))))
|
||||
|
||||
(defun flycheck-rust-find-cargo-target (file-name)
|
||||
"Return the Cargo build target associated with FILE-NAME.
|
||||
|
||||
FILE-NAME is the path of the file that is matched against the
|
||||
`src_path' value in the list of `targets' returned by `cargo
|
||||
read-manifest'.
|
||||
|
||||
Return an alist ((KIND . k) (NAME . n) (REQUIRED-FEATURES . rf))
|
||||
where KIND is the target kind (lib, bin, test, example or bench),
|
||||
NAME the target name (usually, the crate name), and REQUIRED-FEATURES is the
|
||||
optional list of features required to build the selected target. If FILE-NAME
|
||||
exactly matches a target `src-path', this target is returned. Otherwise, return
|
||||
the closest matching target, or nil if no targets could be found.
|
||||
|
||||
See http://doc.crates.io/manifest.html#the-project-layout for a
|
||||
description of the conventional Cargo project layout."
|
||||
(-when-let* ((manifest (flycheck-rust-find-manifest file-name))
|
||||
(packages (flycheck-rust-get-cargo-targets manifest))
|
||||
(targets (-flatten-n 1 packages)))
|
||||
(let ((target
|
||||
(or
|
||||
;; If there is a target that matches the file-name exactly, pick
|
||||
;; that one
|
||||
(seq-find (lambda (target)
|
||||
(let-alist target (string= file-name .src_path)))
|
||||
targets)
|
||||
;; Otherwise find the closest matching target by walking up the tree
|
||||
;; from FILE-NAME and looking for targets in each directory. E.g.,
|
||||
;; the file 'tests/common/a.rs' will look for a target in
|
||||
;; 'tests/common', then in 'tests/', etc.
|
||||
(car (seq-find
|
||||
(lambda (pair)
|
||||
(-let [((&alist 'src_path target-path) . dir) pair]
|
||||
(file-equal-p dir (file-name-directory target-path))))
|
||||
;; build a list of (target . dir) candidates
|
||||
(-table-flat
|
||||
'cons targets
|
||||
(flycheck-rust-dirs-list file-name
|
||||
(file-name-directory manifest)))))
|
||||
;; If all else fails, just pick the first target
|
||||
(car targets))))
|
||||
;; If target is 'custom-build', we pick another target from the same package (see GH-62)
|
||||
(when (string= "custom-build" (let-alist target (car .kind)))
|
||||
(setq target (->> packages
|
||||
;; find the same package as current build-script buffer
|
||||
(--find (--any? (equal target it) it))
|
||||
(--find (not (equal target it))))))
|
||||
(when target
|
||||
(let-alist target
|
||||
(seq-filter (lambda (kv) (cdr kv))
|
||||
(list (cons 'kind (flycheck-rust-normalize-target-kind .kind))
|
||||
(cons 'name .name)
|
||||
(cons 'required-features .required-features))))))))
|
||||
|
||||
|
||||
(defun flycheck-rust-normalize-target-kind (kinds)
|
||||
"Return the normalized target name from KIND.
|
||||
|
||||
KIND is a list of target name as returned by `cargo metadata',
|
||||
which do not necessarily correspond to to target names that can
|
||||
be passed as argument to `cargo rustc'.
|
||||
|
||||
The normalization returns a valid cargo target based on KINDS."
|
||||
;; Assumption: we only care about the first kind name. Multiple kinds only
|
||||
;; seem to happen for library crate types, and those all maps to the same
|
||||
;; `lib' target.
|
||||
(pcase (car kinds)
|
||||
(`"dylib" "lib")
|
||||
(`"rlib" "lib")
|
||||
(`"staticlib" "lib")
|
||||
(`"cdylib" "lib")
|
||||
(`"proc-macro" "lib")
|
||||
(_ (car kinds))))
|
||||
|
||||
;;;###autoload
|
||||
(defun flycheck-rust-setup ()
|
||||
"Setup Rust in Flycheck.
|
||||
|
||||
If the current file is part of a Cargo project, configure
|
||||
Flycheck according to the Cargo project layout."
|
||||
(interactive)
|
||||
;; We should avoid raising any error in this function, as in combination
|
||||
;; with `global-flycheck-mode' it will render Emacs unusable (see
|
||||
;; https://github.com/flycheck/flycheck-rust/issues/40#issuecomment-253760883).
|
||||
(with-demoted-errors "Error in flycheck-rust-setup: %S"
|
||||
(-when-let* ((file-name (buffer-file-name))
|
||||
(target (flycheck-rust-find-cargo-target file-name)))
|
||||
(let-alist target
|
||||
(setq-local flycheck-rust-features .required-features)
|
||||
(setq-local flycheck-rust-crate-type .kind)
|
||||
(setq-local flycheck-rust-binary-name .name)))))
|
||||
|
||||
(provide 'flycheck-rust)
|
||||
|
||||
;;; flycheck-rust.el ends here
|
||||
BIN
elpa/flycheck-rust-20190319.1546/flycheck-rust.elc
Normal file
BIN
elpa/flycheck-rust-20190319.1546/flycheck-rust.elc
Normal file
Binary file not shown.
22
elpa/pos-tip-20150318.1513/pos-tip-autoloads.el
Normal file
22
elpa/pos-tip-20150318.1513/pos-tip-autoloads.el
Normal file
@@ -0,0 +1,22 @@
|
||||
;;; pos-tip-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "pos-tip" "pos-tip.el" (0 0 0 0))
|
||||
;;; Generated autoloads from pos-tip.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "pos-tip" '("pos-tip-")))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; pos-tip-autoloads.el ends here
|
||||
2
elpa/pos-tip-20150318.1513/pos-tip-pkg.el
Normal file
2
elpa/pos-tip-20150318.1513/pos-tip-pkg.el
Normal file
@@ -0,0 +1,2 @@
|
||||
;;; -*- no-byte-compile: t -*-
|
||||
(define-package "pos-tip" "20150318.1513" "Show tooltip at point" 'nil :commit "051e08fec5cf30b7574bdf439f79fef7d42d689d" :keywords '("tooltip") :authors '(("S. Irie")) :maintainer '("S. Irie"))
|
||||
980
elpa/pos-tip-20150318.1513/pos-tip.el
Normal file
980
elpa/pos-tip-20150318.1513/pos-tip.el
Normal file
@@ -0,0 +1,980 @@
|
||||
;;; pos-tip.el --- Show tooltip at point -*- coding: utf-8 -*-
|
||||
|
||||
;; Copyright (C) 2010 S. Irie
|
||||
|
||||
;; Author: S. Irie
|
||||
;; Maintainer: S. Irie
|
||||
;; Keywords: Tooltip
|
||||
;; Package-Version: 20150318.1513
|
||||
|
||||
(defconst pos-tip-version "0.4.6")
|
||||
|
||||
;; This program is free software; you can redistribute it and/or
|
||||
;; modify it under the terms of the GNU General Public License as
|
||||
;; published by the Free Software Foundation; either version 2, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; It is distributed in the hope that it will be useful, but WITHOUT
|
||||
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||
;; License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public
|
||||
;; License along with this program; if not, write to the Free
|
||||
;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
|
||||
;; MA 02110-1301 USA
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; The standard library tooltip.el provides the function for displaying
|
||||
;; a tooltip at mouse position which allows users to easily show it.
|
||||
;; However, locating tooltip at arbitrary buffer position in window
|
||||
;; is not easy. This program provides such function to be used by other
|
||||
;; frontend programs.
|
||||
|
||||
;; This program is tested on GNU Emacs 22, 23 under X window system and
|
||||
;; Emacs 23 for MS-Windows.
|
||||
|
||||
;;
|
||||
;; Installation:
|
||||
;;
|
||||
;; First, save this file as pos-tip.el and byte-compile in
|
||||
;; a directory that is listed in load-path.
|
||||
;;
|
||||
;; Put the following in your .emacs file:
|
||||
;;
|
||||
;; (require 'pos-tip)
|
||||
;;
|
||||
;; To use the full features of this program on MS-Windows,
|
||||
;; put the additional setting in .emacs file:
|
||||
;;
|
||||
;; (pos-tip-w32-max-width-height) ; Maximize frame temporarily
|
||||
;;
|
||||
;; or
|
||||
;;
|
||||
;; (pos-tip-w32-max-width-height t) ; Keep frame maximized
|
||||
|
||||
;;
|
||||
;; Examples:
|
||||
;;
|
||||
;; We can display a tooltip at the current position by the following:
|
||||
;;
|
||||
;; (pos-tip-show "foo bar")
|
||||
;;
|
||||
;; If you'd like to specify the tooltip color, use an expression as:
|
||||
;;
|
||||
;; (pos-tip-show "foo bar" '("white" . "red"))
|
||||
;;
|
||||
;; Here, "white" and "red" are the foreground color and background
|
||||
;; color, respectively.
|
||||
|
||||
|
||||
;;; History:
|
||||
;; 2013-07-16 P. Kalinowski
|
||||
;; * Adjusted `pos-tip-show' to correctly set tooltip text foreground
|
||||
;; color when using custom color themes.
|
||||
;; * Version 0.4.6
|
||||
;;
|
||||
;; 2010-09-27 S. Irie
|
||||
;; * Simplified implementation of `pos-tip-window-system'
|
||||
;; * Version 0.4.5
|
||||
;;
|
||||
;; 2010-08-20 S. Irie
|
||||
;; * Changed to use `window-line-height' to calculate tooltip position
|
||||
;; * Changed `pos-tip-string-width-height' to ignore last empty line
|
||||
;; * Version 0.4.4
|
||||
;;
|
||||
;; 2010-07-25 S. Irie
|
||||
;; * Bug fix
|
||||
;; * Version 0.4.3
|
||||
;;
|
||||
;; 2010-06-09 S. Irie
|
||||
;; * Bug fix
|
||||
;; * Version 0.4.2
|
||||
;;
|
||||
;; 2010-06-04 S. Irie
|
||||
;; * Added support for text-scale-mode
|
||||
;; * Version 0.4.1
|
||||
;;
|
||||
;; 2010-05-04 S. Irie
|
||||
;; * Added functions:
|
||||
;; `pos-tip-x-display-width', `pos-tip-x-display-height'
|
||||
;; `pos-tip-normalize-natnum', `pos-tip-frame-relative-position'
|
||||
;; * Fixed the supports for multi-displays and multi-frames
|
||||
;; * Version 0.4.0
|
||||
;;
|
||||
;; 2010-04-29 S. Irie
|
||||
;; * Modified to avoid byte-compile warning
|
||||
;; * Bug fix
|
||||
;; * Version 0.3.6
|
||||
;;
|
||||
;; 2010-04-29 S. Irie
|
||||
;; * Renamed argument MAX-HEIGHT of `pos-tip-fill-string' to MAX-ROWS
|
||||
;; * Modified old FSF address
|
||||
;; * Version 0.3.5
|
||||
;;
|
||||
;; 2010-04-29 S. Irie
|
||||
;; * Modified `pos-tip-show' to truncate string exceeding display size
|
||||
;; * Added function `pos-tip-truncate-string'
|
||||
;; * Added optional argument MAX-ROWS to `pos-tip-split-string'
|
||||
;; * Added optional argument MAX-HEIGHT to `pos-tip-fill-string'
|
||||
;; * Version 0.3.4
|
||||
;;
|
||||
;; 2010-04-16 S. Irie
|
||||
;; * Changed `pos-tip-show' not to fill paragraph unless exceeding WIDTH
|
||||
;; * Version 0.3.3
|
||||
;;
|
||||
;; 2010-04-08 S. Irie
|
||||
;; * Bug fix
|
||||
;; * Version 0.3.2
|
||||
;;
|
||||
;; 2010-03-31 S. Irie
|
||||
;; * Bug fix
|
||||
;; * Version 0.3.1
|
||||
;;
|
||||
;; 2010-03-30 S. Irie
|
||||
;; * Added support for MS-Windows
|
||||
;; * Added option `pos-tip-use-relative-coordinates'
|
||||
;; * Bug fixes
|
||||
;; * Version 0.3.0
|
||||
;;
|
||||
;; 2010-03-23 S. Irie
|
||||
;; * Changed argument WORD-WRAP to JUSTIFY
|
||||
;; * Added optional argument SQUEEZE
|
||||
;; * Added function `pos-tip-fill-string'
|
||||
;; * Added option `pos-tip-tab-width' used to expand tab characters
|
||||
;; * Bug fixes
|
||||
;; * Version 0.2.0
|
||||
;;
|
||||
;; 2010-03-22 S. Irie
|
||||
;; * Added optional argument WORD-WRAP to `pos-tip-split-string'
|
||||
;; * Changed `pos-tip-show' to perform word wrap or kinsoku shori
|
||||
;; * Version 0.1.8
|
||||
;;
|
||||
;; 2010-03-20 S. Irie
|
||||
;; * Added optional argument DY
|
||||
;; * Bug fix
|
||||
;; * Modified docstrings
|
||||
;; * Version 0.1.7
|
||||
;;
|
||||
;; 2010-03-18 S. Irie
|
||||
;; * Added/modifed docstrings
|
||||
;; * Changed working buffer name to " *xwininfo*"
|
||||
;; * Version 0.1.6
|
||||
;;
|
||||
;; 2010-03-17 S. Irie
|
||||
;; * Fixed typos in docstrings
|
||||
;; * Version 0.1.5
|
||||
;;
|
||||
;; 2010-03-16 S. Irie
|
||||
;; * Added support for multi-display environment
|
||||
;; * Bug fix
|
||||
;; * Version 0.1.4
|
||||
;;
|
||||
;; 2010-03-16 S. Irie
|
||||
;; * Bug fix
|
||||
;; * Changed calculation for `x-max-tooltip-size'
|
||||
;; * Modified docstring
|
||||
;; * Version 0.1.3
|
||||
;;
|
||||
;; 2010-03-11 S. Irie
|
||||
;; * Modified commentary
|
||||
;; * Version 0.1.2
|
||||
;;
|
||||
;; 2010-03-11 S. Irie
|
||||
;; * Re-implemented `pos-tip-string-width-height'
|
||||
;; * Added indicator variable `pos-tip-upperside-p'
|
||||
;; * Version 0.1.1
|
||||
;;
|
||||
;; 2010-03-09 S. Irie
|
||||
;; * Re-implemented `pos-tip-show' (*incompatibly changed*)
|
||||
;; - Use frame default font
|
||||
;; - Automatically calculate tooltip pixel size
|
||||
;; - Added optional arguments: TIP-COLOR, MAX-WIDTH
|
||||
;; * Added utility functions:
|
||||
;; `pos-tip-split-string', `pos-tip-string-width-height'
|
||||
;; * Bug fixes
|
||||
;; * Version 0.1.0
|
||||
;;
|
||||
;; 2010-03-08 S. Irie
|
||||
;; * Added optional argument DX
|
||||
;; * Version 0.0.4
|
||||
;;
|
||||
;; 2010-03-08 S. Irie
|
||||
;; * Bug fix
|
||||
;; * Version 0.0.3
|
||||
;;
|
||||
;; 2010-03-08 S. Irie
|
||||
;; * Modified to move out mouse pointer
|
||||
;; * Version 0.0.2
|
||||
;;
|
||||
;; 2010-03-07 S. Irie
|
||||
;; * First release
|
||||
;; * Version 0.0.1
|
||||
|
||||
;; ToDo:
|
||||
|
||||
;;; Code:
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Settings
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defgroup pos-tip nil
|
||||
"Show tooltip at point"
|
||||
:group 'faces
|
||||
:prefix "pos-tip-")
|
||||
|
||||
(defcustom pos-tip-border-width 1
|
||||
"Outer border width of pos-tip's tooltip."
|
||||
:type 'integer
|
||||
:group 'pos-tip)
|
||||
|
||||
(defcustom pos-tip-internal-border-width 2
|
||||
"Text margin of pos-tip's tooltip."
|
||||
:type 'integer
|
||||
:group 'pos-tip)
|
||||
|
||||
(defcustom pos-tip-foreground-color nil
|
||||
"Default foreground color of pos-tip's tooltip.
|
||||
When `nil', look up the foreground color of the `tooltip' face."
|
||||
:type '(choice (const :tag "Default" nil)
|
||||
string)
|
||||
:group 'pos-tip)
|
||||
|
||||
(defcustom pos-tip-background-color nil
|
||||
"Default background color of pos-tip's tooltip.
|
||||
When `nil', look up the background color of the `tooltip' face."
|
||||
:type '(choice (const :tag "Default" nil)
|
||||
string)
|
||||
:group 'pos-tip)
|
||||
|
||||
(defcustom pos-tip-tab-width nil
|
||||
"Tab width used for `pos-tip-split-string' and `pos-tip-fill-string'
|
||||
to expand tab characters. nil means use default value of `tab-width'."
|
||||
:type '(choice (const :tag "Default" nil)
|
||||
integer)
|
||||
:group 'pos-tip)
|
||||
|
||||
(defcustom pos-tip-use-relative-coordinates nil
|
||||
"Non-nil means tooltip location is calculated as a coordinates
|
||||
relative to the top left corner of frame. In this case the tooltip
|
||||
will always be displayed within the frame.
|
||||
|
||||
Note that this variable is automatically set to non-nil if absolute
|
||||
coordinates can't be obtained by `pos-tip-compute-pixel-position'."
|
||||
:type 'boolean
|
||||
:group 'pos-tip)
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Functions
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun pos-tip-window-system (&optional frame)
|
||||
"The name of the window system that FRAME is displaying through.
|
||||
The value is a symbol---for instance, 'x' for X windows.
|
||||
The value is nil if Emacs is using a text-only terminal.
|
||||
|
||||
FRAME defaults to the currently selected frame."
|
||||
(let ((type (framep (or frame (selected-frame)))))
|
||||
(if type
|
||||
(and (not (eq type t))
|
||||
type)
|
||||
(signal 'wrong-type-argument (list 'framep frame)))))
|
||||
|
||||
(defun pos-tip-normalize-natnum (object &optional n)
|
||||
"Return a Nth power of 2 if OBJECT is a positive integer.
|
||||
Otherwise return 0. Omitting N means return 1 for a positive integer."
|
||||
(ash (if (and (natnump object) (> object 0)) 1 0)
|
||||
(or n 0)))
|
||||
|
||||
(defvar pos-tip-saved-frame-coordinates '(0 . 0)
|
||||
"The latest result of `pos-tip-frame-top-left-coordinates'.")
|
||||
|
||||
(defvar pos-tip-frame-offset nil
|
||||
"The latest result of `pos-tip-calibrate-frame-offset'. This value
|
||||
is used for non-X graphical environment.")
|
||||
|
||||
(defvar pos-tip-frame-offset-array [nil nil nil nil]
|
||||
"Array of the results of `pos-tip-calibrate-frame-offset'. They are
|
||||
recorded only when `pos-tip-frame-top-left-coordinates' is called for a
|
||||
non-X but graphical frame.
|
||||
|
||||
The 2nd and 4th elements are the values for frames having a menu bar.
|
||||
The 3rd and 4th elements are the values for frames having a tool bar.")
|
||||
|
||||
(defun pos-tip-frame-top-left-coordinates (&optional frame)
|
||||
"Return the pixel coordinates of FRAME as a cons cell (LEFT . TOP),
|
||||
which are relative to top left corner of screen.
|
||||
|
||||
Return nil if failing to acquire the coordinates.
|
||||
|
||||
If FRAME is omitted, use selected-frame.
|
||||
|
||||
Users can also get the frame coordinates by referring the variable
|
||||
`pos-tip-saved-frame-coordinates' just after calling this function."
|
||||
(let ((winsys (pos-tip-window-system frame)))
|
||||
(cond
|
||||
((null winsys)
|
||||
(error "text-only frame: %S" frame))
|
||||
((eq winsys 'x)
|
||||
(condition-case nil
|
||||
(with-current-buffer (get-buffer-create " *xwininfo*")
|
||||
(let ((case-fold-search nil))
|
||||
(buffer-disable-undo)
|
||||
(erase-buffer)
|
||||
(call-process shell-file-name nil t nil shell-command-switch
|
||||
(format "xwininfo -display %s -id %s"
|
||||
(frame-parameter frame 'display)
|
||||
(frame-parameter frame 'window-id)))
|
||||
(goto-char (point-min))
|
||||
(search-forward "\n Absolute")
|
||||
(setq pos-tip-saved-frame-coordinates
|
||||
(cons (string-to-number (buffer-substring-no-properties
|
||||
(search-forward "X: ")
|
||||
(line-end-position)))
|
||||
(string-to-number (buffer-substring-no-properties
|
||||
(search-forward "Y: ")
|
||||
(line-end-position)))))))
|
||||
(error nil)))
|
||||
(t
|
||||
(let* ((index (+ (pos-tip-normalize-natnum
|
||||
(frame-parameter frame 'menu-bar-lines) 0)
|
||||
(pos-tip-normalize-natnum
|
||||
(frame-parameter frame 'tool-bar-lines) 1)))
|
||||
(offset (or (aref pos-tip-frame-offset-array index)
|
||||
(aset pos-tip-frame-offset-array index
|
||||
(pos-tip-calibrate-frame-offset frame)))))
|
||||
(if offset
|
||||
(setq pos-tip-saved-frame-coordinates
|
||||
(cons (+ (eval (frame-parameter frame 'left))
|
||||
(car offset))
|
||||
(+ (eval (frame-parameter frame 'top))
|
||||
(cdr offset))))))))))
|
||||
|
||||
(defun pos-tip-frame-relative-position
|
||||
(frame1 frame2 &optional w32-frame frame-coord1 frame-coord2)
|
||||
"Return the pixel coordinates of FRAME1 relative to FRAME2
|
||||
as a cons cell (LEFT . TOP).
|
||||
|
||||
W32-FRAME non-nil means both of frames are under `w32' window system.
|
||||
|
||||
FRAME-COORD1 and FRAME-COORD2, if given, specify the absolute
|
||||
coordinates of FRAME1 and FRAME2, respectively, which make the
|
||||
calculations faster if the frames have different heights of menu bars
|
||||
and tool bars."
|
||||
(if (and (eq (pos-tip-normalize-natnum
|
||||
(frame-parameter frame1 'menu-bar-lines))
|
||||
(pos-tip-normalize-natnum
|
||||
(frame-parameter frame2 'menu-bar-lines)))
|
||||
(or w32-frame
|
||||
(eq (pos-tip-normalize-natnum
|
||||
(frame-parameter frame1 'tool-bar-lines))
|
||||
(pos-tip-normalize-natnum
|
||||
(frame-parameter frame2 'tool-bar-lines)))))
|
||||
(cons (- (eval (frame-parameter frame1 'left))
|
||||
(eval (frame-parameter frame2 'left)))
|
||||
(- (eval (frame-parameter frame1 'top))
|
||||
(eval (frame-parameter frame2 'top))))
|
||||
(unless frame-coord1
|
||||
(setq frame-coord1 (let (pos-tip-saved-frame-coordinates)
|
||||
(pos-tip-frame-top-left-coordinates frame1))))
|
||||
(unless frame-coord2
|
||||
(setq frame-coord2 (let (pos-tip-saved-frame-coordinates)
|
||||
(pos-tip-frame-top-left-coordinates frame2))))
|
||||
(cons (- (car frame-coord1) (car frame-coord2))
|
||||
(- (cdr frame-coord1) (cdr frame-coord2)))))
|
||||
|
||||
(defvar pos-tip-upperside-p nil
|
||||
"Non-nil indicates the latest result of `pos-tip-compute-pixel-position'
|
||||
was upper than the location specified by the arguments.")
|
||||
|
||||
(defvar pos-tip-w32-saved-max-width-height nil
|
||||
"Display pixel size effective for showing tooltip in MS-Windows desktop.
|
||||
This doesn't include the taskbar area, so isn't same as actual display size.")
|
||||
|
||||
(defun pos-tip-compute-pixel-position
|
||||
(&optional pos window pixel-width pixel-height frame-coordinates dx dy)
|
||||
"Return pixel position of POS in WINDOW like (X . Y), which indicates
|
||||
the absolute or relative coordinates of bottom left corner of the object.
|
||||
|
||||
Omitting POS and WINDOW means use current position and selected window,
|
||||
respectively.
|
||||
|
||||
If PIXEL-WIDTH and PIXEL-HEIGHT are given, this function assumes these
|
||||
values as the size of small window like tooltip which is located around the
|
||||
object at POS. These values are used to adjust the location in order that
|
||||
the tooltip won't disappear by sticking out of the display. By referring
|
||||
the variable `pos-tip-upperside-p' after calling this function, user can
|
||||
examine whether the tooltip will be located above the specified position.
|
||||
|
||||
If FRAME-COORDINATES is omitted or nil, automatically obtain the absolute
|
||||
coordinates of the top left corner of frame which WINDOW is on. Here,
|
||||
`top left corner of frame' represents the origin of `window-pixel-edges'
|
||||
and its coordinates are essential for calculating the return value as
|
||||
absolute coordinates. If a cons cell like (LEFT . TOP), specifies the
|
||||
frame absolute location and makes the calculation slightly faster, but can
|
||||
be used only when it's clear that frame is in the specified position. Users
|
||||
can get the latest values of frame coordinates for using in the next call
|
||||
by referring the variable `pos-tip-saved-frame-coordinates' just after
|
||||
calling this function. Otherwise, FRAME-COORDINATES `relative' means return
|
||||
pixel coordinates of the object relative to the top left corner of the frame.
|
||||
This is the same effect as `pos-tip-use-relative-coordinates' is non-nil.
|
||||
|
||||
DX specifies horizontal offset in pixel.
|
||||
|
||||
DY specifies vertical offset in pixel. This makes the calculations done
|
||||
without considering the height of object at POS, so the object might be
|
||||
hidden by the tooltip."
|
||||
(let* ((frame (window-frame (or window (selected-window))))
|
||||
(w32-frame (eq (pos-tip-window-system frame) 'w32))
|
||||
(relative (or pos-tip-use-relative-coordinates
|
||||
(eq frame-coordinates 'relative)
|
||||
(and w32-frame
|
||||
(null pos-tip-w32-saved-max-width-height))))
|
||||
(frame-coord (or (and relative '(0 . 0))
|
||||
frame-coordinates
|
||||
(pos-tip-frame-top-left-coordinates frame)
|
||||
(progn
|
||||
(setq relative t
|
||||
pos-tip-use-relative-coordinates t)
|
||||
'(0 . 0))))
|
||||
(posn (posn-at-point (or pos (window-point window)) window))
|
||||
(line (cdr (posn-actual-col-row posn)))
|
||||
(line-height (and line
|
||||
(or (window-line-height line window)
|
||||
(and (redisplay t)
|
||||
(window-line-height line window)))))
|
||||
(x-y (or (posn-x-y posn)
|
||||
(let ((geom (pos-visible-in-window-p
|
||||
(or pos (window-point window)) window t)))
|
||||
(and geom (cons (car geom) (cadr geom))))
|
||||
'(0 . 0)))
|
||||
(x (+ (car frame-coord)
|
||||
(car (window-inside-pixel-edges window))
|
||||
(car x-y)
|
||||
(or dx 0)))
|
||||
(y0 (+ (cdr frame-coord)
|
||||
(cadr (window-pixel-edges window))
|
||||
(or (nth 2 line-height) (cdr x-y))))
|
||||
(y (+ y0
|
||||
(or dy
|
||||
(car line-height)
|
||||
(with-current-buffer (window-buffer window)
|
||||
(cond
|
||||
;; `posn-object-width-height' returns an incorrect value
|
||||
;; when the header line is displayed (Emacs bug #4426).
|
||||
((and posn
|
||||
(null header-line-format))
|
||||
(cdr (posn-object-width-height posn)))
|
||||
((and (bound-and-true-p text-scale-mode)
|
||||
(not (zerop (with-no-warnings
|
||||
text-scale-mode-amount))))
|
||||
(round (* (frame-char-height frame)
|
||||
(with-no-warnings
|
||||
(expt text-scale-mode-step
|
||||
text-scale-mode-amount)))))
|
||||
(t
|
||||
(frame-char-height frame)))))))
|
||||
xmax ymax)
|
||||
(cond
|
||||
(relative
|
||||
(setq xmax (frame-pixel-width frame)
|
||||
ymax (frame-pixel-height frame)))
|
||||
(w32-frame
|
||||
(setq xmax (car pos-tip-w32-saved-max-width-height)
|
||||
ymax (cdr pos-tip-w32-saved-max-width-height)))
|
||||
(t
|
||||
(setq xmax (x-display-pixel-width frame)
|
||||
ymax (x-display-pixel-height frame))))
|
||||
(setq pos-tip-upperside-p (> (+ y (or pixel-height 0))
|
||||
ymax))
|
||||
(cons (max 0 (min x (- xmax (or pixel-width 0))))
|
||||
(max 0 (if pos-tip-upperside-p
|
||||
(- (if dy ymax y0) (or pixel-height 0))
|
||||
y)))))
|
||||
|
||||
(defun pos-tip-cancel-timer ()
|
||||
"Cancel timeout of tooltip."
|
||||
(mapc (lambda (timer)
|
||||
(if (eq (aref timer 5) 'x-hide-tip)
|
||||
(cancel-timer timer)))
|
||||
timer-list))
|
||||
|
||||
(defun pos-tip-avoid-mouse (left right top bottom &optional frame)
|
||||
"Move out mouse pointer if it is inside region (LEFT RIGHT TOP BOTTOM)
|
||||
in FRAME. Return new mouse position like (FRAME . (X . Y))."
|
||||
(unless frame
|
||||
(setq frame (selected-frame)))
|
||||
(let* ((mpos (with-selected-window (frame-selected-window frame)
|
||||
(mouse-pixel-position)))
|
||||
(mframe (pop mpos))
|
||||
(mx (car mpos))
|
||||
(my (cdr mpos)))
|
||||
(when (and (eq mframe frame)
|
||||
(numberp mx))
|
||||
(let* ((large-number (+ (frame-pixel-width frame) (frame-pixel-height frame)))
|
||||
(dl (if (> left 2)
|
||||
(1+ (- mx left))
|
||||
large-number))
|
||||
(dr (if (< (1+ right) (frame-pixel-width frame))
|
||||
(- right mx)
|
||||
large-number))
|
||||
(dt (if (> top 2)
|
||||
(1+ (- my top))
|
||||
large-number))
|
||||
(db (if (< (1+ bottom) (frame-pixel-height frame))
|
||||
(- bottom my)
|
||||
large-number))
|
||||
(d (min dl dr dt db)))
|
||||
(when (> d -2)
|
||||
(cond
|
||||
((= d dl)
|
||||
(setq mx (- left 2)))
|
||||
((= d dr)
|
||||
(setq mx (1+ right)))
|
||||
((= d dt)
|
||||
(setq my (- top 2)))
|
||||
(t
|
||||
(setq my (1+ bottom))))
|
||||
(set-mouse-pixel-position frame mx my)
|
||||
(sit-for 0.0001))))
|
||||
(cons mframe (and mpos (cons mx my)))))
|
||||
|
||||
(defun pos-tip-compute-foreground-color (tip-color)
|
||||
"Compute the foreground color to use for tooltip.
|
||||
|
||||
TIP-COLOR is a face or a cons cell like (FOREGROUND-COLOR . BACKGROUND-COLOR).
|
||||
If it is nil, use `pos-tip-foreground-color' or the foreground color of the
|
||||
`tooltip' face."
|
||||
(or (and (facep tip-color)
|
||||
(face-attribute tip-color :foreground))
|
||||
(car-safe tip-color)
|
||||
pos-tip-foreground-color
|
||||
(face-foreground 'tooltip)))
|
||||
|
||||
(defun pos-tip-compute-background-color (tip-color)
|
||||
"Compute the background color to use for tooltip.
|
||||
|
||||
TIP-COLOR is a face or a cons cell like (FOREGROUND-COLOR . BACKGROUND-COLOR).
|
||||
If it is nil, use `pos-tip-background-color' or the background color of the
|
||||
`tooltip' face."
|
||||
(or (and (facep tip-color)
|
||||
(face-attribute tip-color :background))
|
||||
(cdr-safe tip-color)
|
||||
pos-tip-background-color
|
||||
(face-background 'tooltip)))
|
||||
|
||||
(defun pos-tip-show-no-propertize
|
||||
(string &optional tip-color pos window timeout pixel-width pixel-height frame-coordinates dx dy)
|
||||
"Show STRING in a tooltip at POS in WINDOW.
|
||||
Analogous to `pos-tip-show' except don't propertize STRING by `pos-tip' face.
|
||||
|
||||
PIXEL-WIDTH and PIXEL-HEIGHT specify the size of tooltip, if given. These
|
||||
are used to adjust the tooltip position in order that it doesn't disappear by
|
||||
sticking out of the display, and also used to prevent it from vanishing by
|
||||
overlapping with mouse pointer.
|
||||
|
||||
Note that this function itself doesn't calculate tooltip size because the
|
||||
character width and height specified by faces are unknown. So users should
|
||||
calculate PIXEL-WIDTH and PIXEL-HEIGHT by using `pos-tip-tooltip-width' and
|
||||
`pos-tip-tooltip-height', or use `pos-tip-show' instead, which can
|
||||
automatically calculate tooltip size.
|
||||
|
||||
See `pos-tip-show' for details.
|
||||
|
||||
Example:
|
||||
|
||||
\(defface my-tooltip
|
||||
'((t
|
||||
:background \"gray85\"
|
||||
:foreground \"black\"
|
||||
:inherit variable-pitch))
|
||||
\"Face for my tooltip.\")
|
||||
|
||||
\(defface my-tooltip-highlight
|
||||
'((t
|
||||
:background \"blue\"
|
||||
:foreground \"white\"
|
||||
:inherit my-tooltip))
|
||||
\"Face for my tooltip highlighted.\")
|
||||
|
||||
\(let ((str (propertize \" foo \\n bar \\n baz \" 'face 'my-tooltip)))
|
||||
(put-text-property 6 11 'face 'my-tooltip-highlight str)
|
||||
(pos-tip-show-no-propertize str 'my-tooltip))"
|
||||
(unless window
|
||||
(setq window (selected-window)))
|
||||
(let* ((frame (window-frame window))
|
||||
(winsys (pos-tip-window-system frame))
|
||||
(x-frame (eq winsys 'x))
|
||||
(w32-frame (eq winsys 'w32))
|
||||
(relative (or pos-tip-use-relative-coordinates
|
||||
(eq frame-coordinates 'relative)
|
||||
(and w32-frame
|
||||
(null pos-tip-w32-saved-max-width-height))))
|
||||
(x-y (prog1
|
||||
(pos-tip-compute-pixel-position pos window
|
||||
pixel-width pixel-height
|
||||
frame-coordinates dx dy)
|
||||
(if pos-tip-use-relative-coordinates
|
||||
(setq relative t))))
|
||||
(ax (car x-y))
|
||||
(ay (cdr x-y))
|
||||
(rx (if relative ax (- ax (car pos-tip-saved-frame-coordinates))))
|
||||
(ry (if relative ay (- ay (cdr pos-tip-saved-frame-coordinates))))
|
||||
(retval (cons rx ry))
|
||||
(fg (pos-tip-compute-foreground-color tip-color))
|
||||
(bg (pos-tip-compute-background-color tip-color))
|
||||
(use-dxdy (or relative
|
||||
(not x-frame)))
|
||||
(spacing (frame-parameter frame 'line-spacing))
|
||||
(border (ash (+ pos-tip-border-width
|
||||
pos-tip-internal-border-width)
|
||||
1))
|
||||
(x-max-tooltip-size
|
||||
(cons (+ (if x-frame 1 0)
|
||||
(/ (- (or pixel-width
|
||||
(cond
|
||||
(relative
|
||||
(frame-pixel-width frame))
|
||||
(w32-frame
|
||||
(car pos-tip-w32-saved-max-width-height))
|
||||
(t
|
||||
(x-display-pixel-width frame))))
|
||||
border)
|
||||
(frame-char-width frame)))
|
||||
(/ (- (or pixel-height
|
||||
(x-display-pixel-height frame))
|
||||
border)
|
||||
(frame-char-height frame))))
|
||||
(mpos (with-selected-window window (mouse-pixel-position)))
|
||||
(mframe (car mpos))
|
||||
default-frame-alist)
|
||||
(if (or relative
|
||||
(and use-dxdy
|
||||
(null (cadr mpos))))
|
||||
(unless (and (cadr mpos)
|
||||
(eq mframe frame))
|
||||
(let* ((edges (window-inside-pixel-edges (cadr (window-list frame))))
|
||||
(mx (ash (+ (pop edges) (cadr edges)) -1))
|
||||
(my (ash (+ (pop edges) (cadr edges)) -1)))
|
||||
(setq mframe frame)
|
||||
(set-mouse-pixel-position mframe mx my)
|
||||
(sit-for 0.0001)))
|
||||
(when (and (cadr mpos)
|
||||
(not (eq mframe frame)))
|
||||
(let ((rel-coord (pos-tip-frame-relative-position frame mframe w32-frame
|
||||
frame-coordinates)))
|
||||
(setq rx (+ rx (car rel-coord))
|
||||
ry (+ ry (cdr rel-coord))))))
|
||||
(and pixel-width pixel-height
|
||||
(setq mpos (pos-tip-avoid-mouse rx (+ rx pixel-width
|
||||
(if w32-frame 3 0))
|
||||
ry (+ ry pixel-height)
|
||||
mframe)))
|
||||
(x-show-tip string mframe
|
||||
`((border-width . ,pos-tip-border-width)
|
||||
(internal-border-width . ,pos-tip-internal-border-width)
|
||||
,@(and (not use-dxdy) `((left . ,ax)
|
||||
(top . ,ay)))
|
||||
(font . ,(frame-parameter frame 'font))
|
||||
,@(and spacing `((line-spacing . ,spacing)))
|
||||
,@(and (stringp fg) `((foreground-color . ,fg)))
|
||||
,@(and (stringp bg) `((background-color . ,bg))))
|
||||
(and timeout (> timeout 0) timeout)
|
||||
(and use-dxdy (- rx (cadr mpos)))
|
||||
(and use-dxdy (- ry (cddr mpos))))
|
||||
(if (and timeout (<= timeout 0))
|
||||
(pos-tip-cancel-timer))
|
||||
retval))
|
||||
|
||||
(defun pos-tip-split-string (string &optional width margin justify squeeze max-rows)
|
||||
"Split STRING into fixed width strings. Return a list of these strings.
|
||||
|
||||
WIDTH specifies the width of filling each paragraph. WIDTH nil means use
|
||||
the width of currently selected frame. Note that this function doesn't add any
|
||||
padding characters at the end of each row.
|
||||
|
||||
MARGIN, if non-nil, specifies left margin width which is the number of spece
|
||||
characters to add at the beginning of each row.
|
||||
|
||||
The optional fourth argument JUSTIFY specifies which kind of justification
|
||||
to do: `full', `left', `right', `center', or `none'. A value of t means handle
|
||||
each paragraph as specified by its text properties. Omitting JUSTIFY means
|
||||
don't perform justification, word wrap and kinsoku shori (禁則処理).
|
||||
|
||||
SQUEEZE nil means leave whitespaces other than line breaks untouched.
|
||||
|
||||
MAX-ROWS, if given, specifies maximum number of elements of return value.
|
||||
The elements exceeding this number are discarded."
|
||||
(with-temp-buffer
|
||||
(let* ((tab-width (or pos-tip-tab-width tab-width))
|
||||
(fill-column (or width (frame-width)))
|
||||
(left-margin (or margin 0))
|
||||
(kinsoku-limit 1)
|
||||
indent-tabs-mode
|
||||
row rows)
|
||||
(insert string)
|
||||
(untabify (point-min) (point-max))
|
||||
(if justify
|
||||
(fill-region (point-min) (point-max) justify (not squeeze))
|
||||
(setq margin (make-string left-margin ?\s)))
|
||||
(goto-char (point-min))
|
||||
(while (prog2
|
||||
(let ((line (buffer-substring
|
||||
(point) (progn (end-of-line) (point)))))
|
||||
(if justify
|
||||
(push line rows)
|
||||
(while (progn
|
||||
(setq line (concat margin line)
|
||||
row (truncate-string-to-width line fill-column))
|
||||
(push row rows)
|
||||
(if (not (= (length row) (length line)))
|
||||
(setq line (substring line (length row))))))))
|
||||
(< (point) (point-max))
|
||||
(beginning-of-line 2)))
|
||||
(nreverse (if max-rows
|
||||
(last rows max-rows)
|
||||
rows)))))
|
||||
|
||||
(defun pos-tip-fill-string (string &optional width margin justify squeeze max-rows)
|
||||
"Fill each of the paragraphs in STRING.
|
||||
|
||||
WIDTH specifies the width of filling each paragraph. WIDTH nil means use
|
||||
the width of currently selected frame. Note that this function doesn't add any
|
||||
padding characters at the end of each row.
|
||||
|
||||
MARGIN, if non-nil, specifies left margin width which is the number of spece
|
||||
characters to add at the beginning of each row.
|
||||
|
||||
The optional fourth argument JUSTIFY specifies which kind of justification
|
||||
to do: `full', `left', `right', `center', or `none'. A value of t means handle
|
||||
each paragraph as specified by its text properties. Omitting JUSTIFY means
|
||||
don't perform justification, word wrap and kinsoku shori (禁則処理).
|
||||
|
||||
SQUEEZE nil means leave whitespaces other than line breaks untouched.
|
||||
|
||||
MAX-ROWS, if given, specifies maximum number of rows. The rows exceeding
|
||||
this number are discarded."
|
||||
(if justify
|
||||
(with-temp-buffer
|
||||
(let* ((tab-width (or pos-tip-tab-width tab-width))
|
||||
(fill-column (or width (frame-width)))
|
||||
(left-margin (or margin 0))
|
||||
(kinsoku-limit 1)
|
||||
indent-tabs-mode)
|
||||
(insert string)
|
||||
(untabify (point-min) (point-max))
|
||||
(fill-region (point-min) (point-max) justify (not squeeze))
|
||||
(if max-rows
|
||||
(buffer-substring (goto-char (point-min))
|
||||
(line-end-position max-rows))
|
||||
(buffer-string))))
|
||||
(mapconcat 'identity
|
||||
(pos-tip-split-string string width margin nil nil max-rows)
|
||||
"\n")))
|
||||
|
||||
(defun pos-tip-truncate-string (string width height)
|
||||
"Truncate each line of STRING to WIDTH and discard lines exceeding HEIGHT."
|
||||
(with-temp-buffer
|
||||
(insert string)
|
||||
(goto-char (point-min))
|
||||
(let ((nrow 0)
|
||||
rows)
|
||||
(while (and (< nrow height)
|
||||
(prog2
|
||||
(push (truncate-string-to-width
|
||||
(buffer-substring (point) (progn (end-of-line) (point)))
|
||||
width)
|
||||
rows)
|
||||
(< (point) (point-max))
|
||||
(beginning-of-line 2)
|
||||
(setq nrow (1+ nrow)))))
|
||||
(mapconcat 'identity (nreverse rows) "\n"))))
|
||||
|
||||
(defun pos-tip-string-width-height (string)
|
||||
"Count columns and rows of STRING. Return a cons cell like (WIDTH . HEIGHT).
|
||||
The last empty line of STRING is ignored.
|
||||
|
||||
Example:
|
||||
|
||||
\(pos-tip-string-width-height \"abc\\nあいう\\n123\")
|
||||
;; => (6 . 3)"
|
||||
(with-temp-buffer
|
||||
(insert string)
|
||||
(goto-char (point-min))
|
||||
(end-of-line)
|
||||
(let ((width (current-column))
|
||||
(height (if (eq (char-before (point-max)) ?\n) 0 1)))
|
||||
(while (< (point) (point-max))
|
||||
(end-of-line 2)
|
||||
(setq width (max (current-column) width)
|
||||
height (1+ height)))
|
||||
(cons width height))))
|
||||
|
||||
(defun pos-tip-x-display-width (&optional frame)
|
||||
"Return maximum column number in tooltip which occupies the full width
|
||||
of display. Omitting FRAME means use display that selected frame is in."
|
||||
(1+ (/ (x-display-pixel-width frame) (frame-char-width frame))))
|
||||
|
||||
(defun pos-tip-x-display-height (&optional frame)
|
||||
"Return maximum row number in tooltip which occupies the full height
|
||||
of display. Omitting FRAME means use display that selected frame is in."
|
||||
(1+ (/ (x-display-pixel-height frame) (frame-char-height frame))))
|
||||
|
||||
(defun pos-tip-tooltip-width (width char-width)
|
||||
"Calculate tooltip pixel width."
|
||||
(+ (* width char-width)
|
||||
(ash (+ pos-tip-border-width
|
||||
pos-tip-internal-border-width)
|
||||
1)))
|
||||
|
||||
(defun pos-tip-tooltip-height (height char-height &optional frame)
|
||||
"Calculate tooltip pixel height."
|
||||
(let ((spacing (or (default-value 'line-spacing)
|
||||
(frame-parameter frame 'line-spacing))))
|
||||
(+ (* height (+ char-height
|
||||
(cond
|
||||
((integerp spacing)
|
||||
spacing)
|
||||
((floatp spacing)
|
||||
(truncate (* (frame-char-height frame)
|
||||
spacing)))
|
||||
(t 0))))
|
||||
(ash (+ pos-tip-border-width
|
||||
pos-tip-internal-border-width)
|
||||
1))))
|
||||
|
||||
(defun pos-tip-show
|
||||
(string &optional tip-color pos window timeout width frame-coordinates dx dy)
|
||||
"Show STRING in a tooltip, which is a small X window, at POS in WINDOW
|
||||
using frame's default font with TIP-COLOR.
|
||||
|
||||
Return pixel position of tooltip relative to top left corner of frame as
|
||||
a cons cell like (X . Y).
|
||||
|
||||
TIP-COLOR is a face or a cons cell like (FOREGROUND-COLOR . BACKGROUND-COLOR)
|
||||
used to specify *only* foreground-color and background-color of tooltip. If
|
||||
omitted, use `pos-tip-foreground-color' and `pos-tip-background-color' or the
|
||||
foreground and background color of the `tooltip' face instead.
|
||||
|
||||
Omitting POS and WINDOW means use current position and selected window,
|
||||
respectively.
|
||||
|
||||
Automatically hide the tooltip after TIMEOUT seconds. Omitting TIMEOUT means
|
||||
use the default timeout of 5 seconds. Non-positive TIMEOUT means don't hide
|
||||
tooltip automatically.
|
||||
|
||||
WIDTH, if non-nil, specifies the width of filling each paragraph.
|
||||
|
||||
If FRAME-COORDINATES is omitted or nil, automatically obtain the absolute
|
||||
coordinates of the top left corner of frame which WINDOW is on. Here,
|
||||
`top left corner of frame' represents the origin of `window-pixel-edges'
|
||||
and its coordinates are essential for calculating the absolute coordinates
|
||||
of the tooltip. If a cons cell like (LEFT . TOP), specifies the frame
|
||||
absolute location and makes the calculation slightly faster, but can be
|
||||
used only when it's clear that frame is in the specified position. Users
|
||||
can get the latest values of frame coordinates for using in the next call
|
||||
by referring the variable `pos-tip-saved-frame-coordinates' just after
|
||||
calling this function. Otherwise, FRAME-COORDINATES `relative' means use
|
||||
the pixel coordinates relative to the top left corner of the frame for
|
||||
displaying the tooltip. This is the same effect as
|
||||
`pos-tip-use-relative-coordinates' is non-nil.
|
||||
|
||||
DX specifies horizontal offset in pixel.
|
||||
|
||||
DY specifies vertical offset in pixel. This makes the calculations done
|
||||
without considering the height of object at POS, so the object might be
|
||||
hidden by the tooltip.
|
||||
|
||||
See also `pos-tip-show-no-propertize'."
|
||||
(unless window
|
||||
(setq window (selected-window)))
|
||||
(let* ((frame (window-frame window))
|
||||
(max-width (pos-tip-x-display-width frame))
|
||||
(max-height (pos-tip-x-display-height frame))
|
||||
(w-h (pos-tip-string-width-height string))
|
||||
(fg (pos-tip-compute-foreground-color tip-color))
|
||||
(bg (pos-tip-compute-background-color tip-color))
|
||||
(frame-font (find-font (font-spec :name (frame-parameter frame 'font))))
|
||||
(tip-face-attrs (list :font frame-font :foreground fg :background bg)))
|
||||
(cond
|
||||
((and width
|
||||
(> (car w-h) width))
|
||||
(setq string (pos-tip-fill-string string width nil 'none nil max-height)
|
||||
w-h (pos-tip-string-width-height string)))
|
||||
((or (> (car w-h) max-width)
|
||||
(> (cdr w-h) max-height))
|
||||
(setq string (pos-tip-truncate-string string max-width max-height)
|
||||
w-h (pos-tip-string-width-height string))))
|
||||
(pos-tip-show-no-propertize
|
||||
(propertize string 'face tip-face-attrs)
|
||||
tip-color pos window timeout
|
||||
(pos-tip-tooltip-width (car w-h) (frame-char-width frame))
|
||||
(pos-tip-tooltip-height (cdr w-h) (frame-char-height frame) frame)
|
||||
frame-coordinates dx dy)))
|
||||
|
||||
(defalias 'pos-tip-hide 'x-hide-tip
|
||||
"Hide pos-tip's tooltip.")
|
||||
|
||||
(defun pos-tip-calibrate-frame-offset (&optional frame)
|
||||
"Return coordinates of FRAME orign relative to the top left corner of
|
||||
the FRAME extent, like (LEFT . TOP). The return value is recorded to
|
||||
`pos-tip-frame-offset'.
|
||||
|
||||
Note that this function does't correctly work for X frame and Emacs 22."
|
||||
(setq pos-tip-frame-offset nil)
|
||||
(let* ((window (frame-first-window frame))
|
||||
(delete-frame-functions
|
||||
'((lambda (frame)
|
||||
(if (equal (frame-parameter frame 'name) "tooltip")
|
||||
(setq pos-tip-frame-offset
|
||||
(cons (eval (frame-parameter frame 'left))
|
||||
(eval (frame-parameter frame 'top))))))))
|
||||
(pos-tip-border-width 0)
|
||||
(pos-tip-internal-border-width 1)
|
||||
(rpos (pos-tip-show ""
|
||||
`(nil . ,(frame-parameter frame 'background-color))
|
||||
(window-start window) window
|
||||
nil nil 'relative nil 0)))
|
||||
(sit-for 0)
|
||||
(pos-tip-hide)
|
||||
(and pos-tip-frame-offset
|
||||
(setq pos-tip-frame-offset
|
||||
(cons (- (car pos-tip-frame-offset)
|
||||
(car rpos)
|
||||
(eval (frame-parameter frame 'left)))
|
||||
(- (cdr pos-tip-frame-offset)
|
||||
(cdr rpos)
|
||||
(eval (frame-parameter frame 'top))))))))
|
||||
|
||||
(defun pos-tip-w32-max-width-height (&optional keep-maximize)
|
||||
"Maximize the currently selected frame temporarily and set
|
||||
`pos-tip-w32-saved-max-width-height' the effective display size in order
|
||||
to become possible to calculate the absolute location of tooltip.
|
||||
|
||||
KEEP-MAXIMIZE non-nil means leave the frame maximized.
|
||||
|
||||
Note that this function is usable only in Emacs 23 for MS-Windows."
|
||||
(interactive)
|
||||
(unless (eq window-system 'w32)
|
||||
(error "`pos-tip-w32-max-width-height' can be used only in w32 frame."))
|
||||
;; Maximize frame
|
||||
(with-no-warnings (w32-send-sys-command 61488))
|
||||
(sit-for 0)
|
||||
(let ((offset (pos-tip-calibrate-frame-offset)))
|
||||
(prog1
|
||||
(setq pos-tip-w32-saved-max-width-height
|
||||
(cons (frame-pixel-width)
|
||||
(+ (frame-pixel-height)
|
||||
(- (cdr offset) (car offset)))))
|
||||
(if (called-interactively-p 'interactive)
|
||||
(message "%S" pos-tip-w32-saved-max-width-height))
|
||||
(unless keep-maximize
|
||||
;; Restore frame
|
||||
(with-no-warnings (w32-send-sys-command 61728))))))
|
||||
|
||||
|
||||
(provide 'pos-tip)
|
||||
|
||||
;;;
|
||||
;;; pos-tip.el ends here
|
||||
BIN
elpa/pos-tip-20150318.1513/pos-tip.elc
Normal file
BIN
elpa/pos-tip-20150318.1513/pos-tip.elc
Normal file
Binary file not shown.
22
elpa/s-20180406.808/s-autoloads.el
Normal file
22
elpa/s-20180406.808/s-autoloads.el
Normal file
@@ -0,0 +1,22 @@
|
||||
;;; s-autoloads.el --- automatically extracted autoloads
|
||||
;;
|
||||
;;; Code:
|
||||
|
||||
(add-to-list 'load-path (directory-file-name
|
||||
(or (file-name-directory #$) (car load-path))))
|
||||
|
||||
|
||||
;;;### (autoloads nil "s" "s.el" (0 0 0 0))
|
||||
;;; Generated autoloads from s.el
|
||||
|
||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "s" '("s-")))
|
||||
|
||||
;;;***
|
||||
|
||||
;; Local Variables:
|
||||
;; version-control: never
|
||||
;; no-byte-compile: t
|
||||
;; no-update-autoloads: t
|
||||
;; coding: utf-8
|
||||
;; End:
|
||||
;;; s-autoloads.el ends here
|
||||
2
elpa/s-20180406.808/s-pkg.el
Normal file
2
elpa/s-20180406.808/s-pkg.el
Normal file
@@ -0,0 +1,2 @@
|
||||
;;; -*- no-byte-compile: t -*-
|
||||
(define-package "s" "20180406.808" "The long lost Emacs string manipulation library." 'nil :commit "03410e6a7a2b11e47e1fea3b7d9899c7df26435e" :keywords '("strings") :authors '(("Magnar Sveen" . "magnars@gmail.com")) :maintainer '("Magnar Sveen" . "magnars@gmail.com"))
|
||||
747
elpa/s-20180406.808/s.el
Normal file
747
elpa/s-20180406.808/s.el
Normal file
@@ -0,0 +1,747 @@
|
||||
;;; s.el --- The long lost Emacs string manipulation library.
|
||||
|
||||
;; Copyright (C) 2012-2015 Magnar Sveen
|
||||
|
||||
;; Author: Magnar Sveen <magnars@gmail.com>
|
||||
;; Version: 1.12.0
|
||||
;; Package-Version: 20180406.808
|
||||
;; Keywords: strings
|
||||
|
||||
;; This program is free software; you can redistribute it and/or modify
|
||||
;; it under the terms of the GNU General Public License as published by
|
||||
;; the Free Software Foundation, either version 3 of the License, or
|
||||
;; (at your option) any later version.
|
||||
|
||||
;; This program is distributed in the hope that it will be useful,
|
||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
;; GNU General Public License for more details.
|
||||
|
||||
;; You should have received a copy of the GNU General Public License
|
||||
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;; The long lost Emacs string manipulation library.
|
||||
;;
|
||||
;; See documentation on https://github.com/magnars/s.el#functions
|
||||
|
||||
;;; Code:
|
||||
|
||||
;; Silence byte-compiler
|
||||
(defvar ucs-normalize-combining-chars) ; Defined in `ucs-normalize'
|
||||
(autoload 'slot-value "eieio")
|
||||
|
||||
(defun s-trim-left (s)
|
||||
"Remove whitespace at the beginning of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(save-match-data
|
||||
(if (string-match "\\`[ \t\n\r]+" s)
|
||||
(replace-match "" t t s)
|
||||
s)))
|
||||
|
||||
(defun s-trim-right (s)
|
||||
"Remove whitespace at the end of S."
|
||||
(save-match-data
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(if (string-match "[ \t\n\r]+\\'" s)
|
||||
(replace-match "" t t s)
|
||||
s)))
|
||||
|
||||
(defun s-trim (s)
|
||||
"Remove whitespace at the beginning and end of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(s-trim-left (s-trim-right s)))
|
||||
|
||||
(defun s-collapse-whitespace (s)
|
||||
"Convert all adjacent whitespace characters to a single space."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(replace-regexp-in-string "[ \t\n\r]+" " " s))
|
||||
|
||||
(defun s-split (separator s &optional omit-nulls)
|
||||
"Split S into substrings bounded by matches for regexp SEPARATOR.
|
||||
If OMIT-NULLS is non-nil, zero-length substrings are omitted.
|
||||
|
||||
This is a simple wrapper around the built-in `split-string'."
|
||||
(declare (side-effect-free t))
|
||||
(save-match-data
|
||||
(split-string s separator omit-nulls)))
|
||||
|
||||
(defun s-split-up-to (separator s n &optional omit-nulls)
|
||||
"Split S up to N times into substrings bounded by matches for regexp SEPARATOR.
|
||||
|
||||
If OMIT-NULLS is non-nil, zero-length substrings are omitted.
|
||||
|
||||
See also `s-split'."
|
||||
(declare (side-effect-free t))
|
||||
(save-match-data
|
||||
(let ((op 0)
|
||||
(r nil))
|
||||
(with-temp-buffer
|
||||
(insert s)
|
||||
(setq op (goto-char (point-min)))
|
||||
(while (and (re-search-forward separator nil t)
|
||||
(< 0 n))
|
||||
(let ((sub (buffer-substring op (match-beginning 0))))
|
||||
(unless (and omit-nulls
|
||||
(equal sub ""))
|
||||
(push sub r)))
|
||||
(setq op (goto-char (match-end 0)))
|
||||
(setq n (1- n)))
|
||||
(let ((sub (buffer-substring op (point-max))))
|
||||
(unless (and omit-nulls
|
||||
(equal sub ""))
|
||||
(push sub r))))
|
||||
(nreverse r))))
|
||||
|
||||
(defun s-lines (s)
|
||||
"Splits S into a list of strings on newline characters."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(s-split "\\(\r\n\\|[\n\r]\\)" s))
|
||||
|
||||
(defun s-join (separator strings)
|
||||
"Join all the strings in STRINGS with SEPARATOR in between."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(mapconcat 'identity strings separator))
|
||||
|
||||
(defun s-concat (&rest strings)
|
||||
"Join all the string arguments into one string."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(apply 'concat strings))
|
||||
|
||||
(defun s-prepend (prefix s)
|
||||
"Concatenate PREFIX and S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(concat prefix s))
|
||||
|
||||
(defun s-append (suffix s)
|
||||
"Concatenate S and SUFFIX."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(concat s suffix))
|
||||
|
||||
(defun s-repeat (num s)
|
||||
"Make a string of S repeated NUM times."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let (ss)
|
||||
(while (> num 0)
|
||||
(setq ss (cons s ss))
|
||||
(setq num (1- num)))
|
||||
(apply 'concat ss)))
|
||||
|
||||
(defun s-chop-suffix (suffix s)
|
||||
"Remove SUFFIX if it is at end of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((pos (- (length suffix))))
|
||||
(if (and (>= (length s) (length suffix))
|
||||
(string= suffix (substring s pos)))
|
||||
(substring s 0 pos)
|
||||
s)))
|
||||
|
||||
(defun s-chop-suffixes (suffixes s)
|
||||
"Remove SUFFIXES one by one in order, if they are at the end of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(while suffixes
|
||||
(setq s (s-chop-suffix (car suffixes) s))
|
||||
(setq suffixes (cdr suffixes)))
|
||||
s)
|
||||
|
||||
(defun s-chop-prefix (prefix s)
|
||||
"Remove PREFIX if it is at the start of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((pos (length prefix)))
|
||||
(if (and (>= (length s) (length prefix))
|
||||
(string= prefix (substring s 0 pos)))
|
||||
(substring s pos)
|
||||
s)))
|
||||
|
||||
(defun s-chop-prefixes (prefixes s)
|
||||
"Remove PREFIXES one by one in order, if they are at the start of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(while prefixes
|
||||
(setq s (s-chop-prefix (car prefixes) s))
|
||||
(setq prefixes (cdr prefixes)))
|
||||
s)
|
||||
|
||||
(defun s-shared-start (s1 s2)
|
||||
"Returns the longest prefix S1 and S2 have in common."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((search-length (min (length s1) (length s2)))
|
||||
(i 0))
|
||||
(while (and (< i search-length)
|
||||
(= (aref s1 i) (aref s2 i)))
|
||||
(setq i (1+ i)))
|
||||
(substring s1 0 i)))
|
||||
|
||||
(defun s-shared-end (s1 s2)
|
||||
"Returns the longest suffix S1 and S2 have in common."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let* ((l1 (length s1))
|
||||
(l2 (length s2))
|
||||
(search-length (min l1 l2))
|
||||
(i 0))
|
||||
(while (and (< i search-length)
|
||||
(= (aref s1 (- l1 i 1)) (aref s2 (- l2 i 1))))
|
||||
(setq i (1+ i)))
|
||||
;; If I is 0, then it means that there's no common suffix between
|
||||
;; S1 and S2.
|
||||
;;
|
||||
;; However, since (substring s (- 0)) will return the whole
|
||||
;; string, `s-shared-end' should simply return the empty string
|
||||
;; when I is 0.
|
||||
(if (zerop i)
|
||||
""
|
||||
(substring s1 (- i)))))
|
||||
|
||||
(defun s-chomp (s)
|
||||
"Remove one trailing `\\n`, `\\r` or `\\r\\n` from S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(s-chop-suffixes '("\n" "\r") s))
|
||||
|
||||
(defun s-truncate (len s &optional ellipsis)
|
||||
"If S is longer than LEN, cut it down and add ELLIPSIS to the end.
|
||||
|
||||
The resulting string, including ellipsis, will be LEN characters
|
||||
long.
|
||||
|
||||
When not specified, ELLIPSIS defaults to ‘...’."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(unless ellipsis
|
||||
(setq ellipsis "..."))
|
||||
(if (> (length s) len)
|
||||
(format "%s%s" (substring s 0 (- len (length ellipsis))) ellipsis)
|
||||
s))
|
||||
|
||||
(defun s-word-wrap (len s)
|
||||
"If S is longer than LEN, wrap the words with newlines."
|
||||
(declare (side-effect-free t))
|
||||
(save-match-data
|
||||
(with-temp-buffer
|
||||
(insert s)
|
||||
(let ((fill-column len))
|
||||
(fill-region (point-min) (point-max)))
|
||||
(buffer-substring (point-min) (point-max)))))
|
||||
|
||||
(defun s-center (len s)
|
||||
"If S is shorter than LEN, pad it with spaces so it is centered."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((extra (max 0 (- len (length s)))))
|
||||
(concat
|
||||
(make-string (ceiling extra 2) ? )
|
||||
s
|
||||
(make-string (floor extra 2) ? ))))
|
||||
|
||||
(defun s-pad-left (len padding s)
|
||||
"If S is shorter than LEN, pad it with PADDING on the left."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((extra (max 0 (- len (length s)))))
|
||||
(concat (make-string extra (string-to-char padding))
|
||||
s)))
|
||||
|
||||
(defun s-pad-right (len padding s)
|
||||
"If S is shorter than LEN, pad it with PADDING on the right."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((extra (max 0 (- len (length s)))))
|
||||
(concat s
|
||||
(make-string extra (string-to-char padding)))))
|
||||
|
||||
(defun s-left (len s)
|
||||
"Returns up to the LEN first chars of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(if (> (length s) len)
|
||||
(substring s 0 len)
|
||||
s))
|
||||
|
||||
(defun s-right (len s)
|
||||
"Returns up to the LEN last chars of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((l (length s)))
|
||||
(if (> l len)
|
||||
(substring s (- l len) l)
|
||||
s)))
|
||||
|
||||
(defun s-ends-with? (suffix s &optional ignore-case)
|
||||
"Does S end with SUFFIX?
|
||||
|
||||
If IGNORE-CASE is non-nil, the comparison is done without paying
|
||||
attention to case differences.
|
||||
|
||||
Alias: `s-suffix?'"
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((start-pos (- (length s) (length suffix))))
|
||||
(and (>= start-pos 0)
|
||||
(eq t (compare-strings suffix nil nil
|
||||
s start-pos nil ignore-case)))))
|
||||
|
||||
(defun s-starts-with? (prefix s &optional ignore-case)
|
||||
"Does S start with PREFIX?
|
||||
|
||||
If IGNORE-CASE is non-nil, the comparison is done without paying
|
||||
attention to case differences.
|
||||
|
||||
Alias: `s-prefix?'. This is a simple wrapper around the built-in
|
||||
`string-prefix-p'."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(string-prefix-p prefix s ignore-case))
|
||||
|
||||
(defun s--truthy? (val)
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(not (null val)))
|
||||
|
||||
(defun s-contains? (needle s &optional ignore-case)
|
||||
"Does S contain NEEDLE?
|
||||
|
||||
If IGNORE-CASE is non-nil, the comparison is done without paying
|
||||
attention to case differences."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((case-fold-search ignore-case))
|
||||
(s--truthy? (string-match-p (regexp-quote needle) s))))
|
||||
|
||||
(defun s-equals? (s1 s2)
|
||||
"Is S1 equal to S2?
|
||||
|
||||
This is a simple wrapper around the built-in `string-equal'."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(string-equal s1 s2))
|
||||
|
||||
(defun s-less? (s1 s2)
|
||||
"Is S1 less than S2?
|
||||
|
||||
This is a simple wrapper around the built-in `string-lessp'."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(string-lessp s1 s2))
|
||||
|
||||
(defun s-matches? (regexp s &optional start)
|
||||
"Does REGEXP match S?
|
||||
If START is non-nil the search starts at that index.
|
||||
|
||||
This is a simple wrapper around the built-in `string-match-p'."
|
||||
(declare (side-effect-free t))
|
||||
(s--truthy? (string-match-p regexp s start)))
|
||||
|
||||
(defun s-blank? (s)
|
||||
"Is S nil or the empty string?"
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(or (null s) (string= "" s)))
|
||||
|
||||
(defun s-blank-str? (s)
|
||||
"Is S nil or the empty string or string only contains whitespace?"
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(or (s-blank? s) (s-blank? (s-trim s))))
|
||||
|
||||
(defun s-present? (s)
|
||||
"Is S anything but nil or the empty string?"
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(not (s-blank? s)))
|
||||
|
||||
(defun s-presence (s)
|
||||
"Return S if it's `s-present?', otherwise return nil."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(and (s-present? s) s))
|
||||
|
||||
(defun s-lowercase? (s)
|
||||
"Are all the letters in S in lower case?"
|
||||
(declare (side-effect-free t))
|
||||
(let ((case-fold-search nil))
|
||||
(not (string-match-p "[[:upper:]]" s))))
|
||||
|
||||
(defun s-uppercase? (s)
|
||||
"Are all the letters in S in upper case?"
|
||||
(declare (side-effect-free t))
|
||||
(let ((case-fold-search nil))
|
||||
(not (string-match-p "[[:lower:]]" s))))
|
||||
|
||||
(defun s-mixedcase? (s)
|
||||
"Are there both lower case and upper case letters in S?"
|
||||
(let ((case-fold-search nil))
|
||||
(s--truthy?
|
||||
(and (string-match-p "[[:lower:]]" s)
|
||||
(string-match-p "[[:upper:]]" s)))))
|
||||
|
||||
(defun s-capitalized? (s)
|
||||
"In S, is the first letter upper case, and all other letters lower case?"
|
||||
(declare (side-effect-free t))
|
||||
(let ((case-fold-search nil))
|
||||
(s--truthy?
|
||||
(string-match-p "^[[:upper:]][^[:upper:]]*$" s))))
|
||||
|
||||
(defun s-numeric? (s)
|
||||
"Is S a number?"
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(s--truthy?
|
||||
(string-match-p "^[0-9]+$" s)))
|
||||
|
||||
(defun s-replace (old new s)
|
||||
"Replaces OLD with NEW in S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(replace-regexp-in-string (regexp-quote old) new s t t))
|
||||
|
||||
(defalias 's-replace-regexp 'replace-regexp-in-string)
|
||||
|
||||
(defun s--aget (alist key)
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(cdr (assoc-string key alist)))
|
||||
|
||||
(defun s-replace-all (replacements s)
|
||||
"REPLACEMENTS is a list of cons-cells. Each `car` is replaced with `cdr` in S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(replace-regexp-in-string (regexp-opt (mapcar 'car replacements))
|
||||
(lambda (it) (s--aget replacements it))
|
||||
s t t))
|
||||
|
||||
(defun s-downcase (s)
|
||||
"Convert S to lower case.
|
||||
|
||||
This is a simple wrapper around the built-in `downcase'."
|
||||
(declare (side-effect-free t))
|
||||
(downcase s))
|
||||
|
||||
(defun s-upcase (s)
|
||||
"Convert S to upper case.
|
||||
|
||||
This is a simple wrapper around the built-in `upcase'."
|
||||
(declare (side-effect-free t))
|
||||
(upcase s))
|
||||
|
||||
(defun s-capitalize (s)
|
||||
"Convert the first word's first character to upper case and the rest to lower case in S."
|
||||
(declare (side-effect-free t))
|
||||
(concat (upcase (substring s 0 1)) (downcase (substring s 1))))
|
||||
|
||||
(defun s-titleize (s)
|
||||
"Convert each word's first character to upper case and the rest to lower case in S.
|
||||
|
||||
This is a simple wrapper around the built-in `capitalize'."
|
||||
(declare (side-effect-free t))
|
||||
(capitalize s))
|
||||
|
||||
(defmacro s-with (s form &rest more)
|
||||
"Threads S through the forms. Inserts S as the last item
|
||||
in the first form, making a list of it if it is not a list
|
||||
already. If there are more forms, inserts the first form as the
|
||||
last item in second form, etc."
|
||||
(declare (debug (form &rest [&or (function &rest form) fboundp])))
|
||||
(if (null more)
|
||||
(if (listp form)
|
||||
`(,(car form) ,@(cdr form) ,s)
|
||||
(list form s))
|
||||
`(s-with (s-with ,s ,form) ,@more)))
|
||||
|
||||
(put 's-with 'lisp-indent-function 1)
|
||||
|
||||
(defun s-index-of (needle s &optional ignore-case)
|
||||
"Returns first index of NEEDLE in S, or nil.
|
||||
|
||||
If IGNORE-CASE is non-nil, the comparison is done without paying
|
||||
attention to case differences."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(let ((case-fold-search ignore-case))
|
||||
(string-match-p (regexp-quote needle) s)))
|
||||
|
||||
(defun s-reverse (s)
|
||||
"Return the reverse of S."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(save-match-data
|
||||
(if (multibyte-string-p s)
|
||||
(let ((input (string-to-list s))
|
||||
output)
|
||||
(require 'ucs-normalize)
|
||||
(while input
|
||||
;; Handle entire grapheme cluster as a single unit
|
||||
(let ((grapheme (list (pop input))))
|
||||
(while (memql (car input) ucs-normalize-combining-chars)
|
||||
(push (pop input) grapheme))
|
||||
(setq output (nconc (nreverse grapheme) output))))
|
||||
(concat output))
|
||||
(concat (nreverse (string-to-list s))))))
|
||||
|
||||
(defun s-match-strings-all (regex string)
|
||||
"Return a list of matches for REGEX in STRING.
|
||||
|
||||
Each element itself is a list of matches, as per
|
||||
`match-string'. Multiple matches at the same position will be
|
||||
ignored after the first."
|
||||
(declare (side-effect-free t))
|
||||
(save-match-data
|
||||
(let ((all-strings ())
|
||||
(i 0))
|
||||
(while (and (< i (length string))
|
||||
(string-match regex string i))
|
||||
(setq i (1+ (match-beginning 0)))
|
||||
(let (strings
|
||||
(num-matches (/ (length (match-data)) 2))
|
||||
(match 0))
|
||||
(while (/= match num-matches)
|
||||
(push (match-string match string) strings)
|
||||
(setq match (1+ match)))
|
||||
(push (nreverse strings) all-strings)))
|
||||
(nreverse all-strings))))
|
||||
|
||||
(defun s-matched-positions-all (regexp string &optional subexp-depth)
|
||||
"Return a list of matched positions for REGEXP in STRING.
|
||||
SUBEXP-DEPTH is 0 by default."
|
||||
(declare (side-effect-free t))
|
||||
(if (null subexp-depth)
|
||||
(setq subexp-depth 0))
|
||||
(save-match-data
|
||||
(let ((pos 0) result)
|
||||
(while (and (string-match regexp string pos)
|
||||
(< pos (length string)))
|
||||
(let ((m (match-end subexp-depth)))
|
||||
(push (cons (match-beginning subexp-depth) (match-end subexp-depth)) result)
|
||||
(setq pos (match-end 0))))
|
||||
(nreverse result))))
|
||||
|
||||
(defun s-match (regexp s &optional start)
|
||||
"When the given expression matches the string, this function returns a list
|
||||
of the whole matching string and a string for each matched subexpressions.
|
||||
If it did not match the returned value is an empty list (nil).
|
||||
|
||||
When START is non-nil the search will start at that index."
|
||||
(declare (side-effect-free t))
|
||||
(save-match-data
|
||||
(if (string-match regexp s start)
|
||||
(let ((match-data-list (match-data))
|
||||
result)
|
||||
(while match-data-list
|
||||
(let* ((beg (car match-data-list))
|
||||
(end (cadr match-data-list))
|
||||
(subs (if (and beg end) (substring s beg end) nil)))
|
||||
(setq result (cons subs result))
|
||||
(setq match-data-list
|
||||
(cddr match-data-list))))
|
||||
(nreverse result)))))
|
||||
|
||||
(defun s-slice-at (regexp s)
|
||||
"Slices S up at every index matching REGEXP."
|
||||
(declare (side-effect-free t))
|
||||
(if (= 0 (length s)) (list "")
|
||||
(save-match-data
|
||||
(let (i)
|
||||
(setq i (string-match regexp s 1))
|
||||
(if i
|
||||
(cons (substring s 0 i)
|
||||
(s-slice-at regexp (substring s i)))
|
||||
(list s))))))
|
||||
|
||||
(defun s-split-words (s)
|
||||
"Split S into list of words."
|
||||
(declare (side-effect-free t))
|
||||
(s-split
|
||||
"[^[:word:]0-9]+"
|
||||
(let ((case-fold-search nil))
|
||||
(replace-regexp-in-string
|
||||
"\\([[:lower:]]\\)\\([[:upper:]]\\)" "\\1 \\2"
|
||||
(replace-regexp-in-string "\\([[:upper:]]\\)\\([[:upper:]][0-9[:lower:]]\\)" "\\1 \\2" s)))
|
||||
t))
|
||||
|
||||
(defun s--mapcar-head (fn-head fn-rest list)
|
||||
"Like MAPCAR, but applies a different function to the first element."
|
||||
(if list
|
||||
(cons (funcall fn-head (car list)) (mapcar fn-rest (cdr list)))))
|
||||
|
||||
(defun s-lower-camel-case (s)
|
||||
"Convert S to lowerCamelCase."
|
||||
(declare (side-effect-free t))
|
||||
(s-join "" (s--mapcar-head 'downcase 'capitalize (s-split-words s))))
|
||||
|
||||
(defun s-upper-camel-case (s)
|
||||
"Convert S to UpperCamelCase."
|
||||
(declare (side-effect-free t))
|
||||
(s-join "" (mapcar 'capitalize (s-split-words s))))
|
||||
|
||||
(defun s-snake-case (s)
|
||||
"Convert S to snake_case."
|
||||
(declare (side-effect-free t))
|
||||
(s-join "_" (mapcar 'downcase (s-split-words s))))
|
||||
|
||||
(defun s-dashed-words (s)
|
||||
"Convert S to dashed-words."
|
||||
(declare (side-effect-free t))
|
||||
(s-join "-" (mapcar 'downcase (s-split-words s))))
|
||||
|
||||
(defun s-capitalized-words (s)
|
||||
"Convert S to Capitalized words."
|
||||
(declare (side-effect-free t))
|
||||
(let ((words (s-split-words s)))
|
||||
(s-join " " (cons (capitalize (car words)) (mapcar 'downcase (cdr words))))))
|
||||
|
||||
(defun s-titleized-words (s)
|
||||
"Convert S to Titleized Words."
|
||||
(declare (side-effect-free t))
|
||||
(s-join " " (mapcar 's-titleize (s-split-words s))))
|
||||
|
||||
(defun s-word-initials (s)
|
||||
"Convert S to its initials."
|
||||
(declare (side-effect-free t))
|
||||
(s-join "" (mapcar (lambda (ss) (substring ss 0 1))
|
||||
(s-split-words s))))
|
||||
|
||||
;; Errors for s-format
|
||||
(progn
|
||||
(put 's-format-resolve
|
||||
'error-conditions
|
||||
'(error s-format s-format-resolve))
|
||||
(put 's-format-resolve
|
||||
'error-message
|
||||
"Cannot resolve a template to values"))
|
||||
|
||||
(defun s-format (template replacer &optional extra)
|
||||
"Format TEMPLATE with the function REPLACER.
|
||||
|
||||
REPLACER takes an argument of the format variable and optionally
|
||||
an extra argument which is the EXTRA value from the call to
|
||||
`s-format'.
|
||||
|
||||
Several standard `s-format' helper functions are recognized and
|
||||
adapted for this:
|
||||
|
||||
(s-format \"${name}\" 'gethash hash-table)
|
||||
(s-format \"${name}\" 'aget alist)
|
||||
(s-format \"$0\" 'elt sequence)
|
||||
|
||||
The REPLACER function may be used to do any other kind of
|
||||
transformation."
|
||||
(let ((saved-match-data (match-data)))
|
||||
(unwind-protect
|
||||
(replace-regexp-in-string
|
||||
"\\$\\({\\([^}]+\\)}\\|[0-9]+\\)"
|
||||
(lambda (md)
|
||||
(let ((var
|
||||
(let ((m (match-string 2 md)))
|
||||
(if m m
|
||||
(string-to-number (match-string 1 md)))))
|
||||
(replacer-match-data (match-data)))
|
||||
(unwind-protect
|
||||
(let ((v
|
||||
(cond
|
||||
((eq replacer 'gethash)
|
||||
(funcall replacer var extra))
|
||||
((eq replacer 'aget)
|
||||
(funcall 's--aget extra var))
|
||||
((eq replacer 'elt)
|
||||
(funcall replacer extra var))
|
||||
((eq replacer 'oref)
|
||||
(funcall #'slot-value extra (intern var)))
|
||||
(t
|
||||
(set-match-data saved-match-data)
|
||||
(if extra
|
||||
(funcall replacer var extra)
|
||||
(funcall replacer var))))))
|
||||
(if v (format "%s" v) (signal 's-format-resolve md)))
|
||||
(set-match-data replacer-match-data)))) template
|
||||
;; Need literal to make sure it works
|
||||
t t)
|
||||
(set-match-data saved-match-data))))
|
||||
|
||||
(defvar s-lex-value-as-lisp nil
|
||||
"If `t' interpolate lisp values as lisp.
|
||||
|
||||
`s-lex-format' inserts values with (format \"%S\").")
|
||||
|
||||
(defun s-lex-fmt|expand (fmt)
|
||||
"Expand FMT into lisp."
|
||||
(declare (side-effect-free t))
|
||||
(list 's-format fmt (quote 'aget)
|
||||
(append '(list)
|
||||
(mapcar
|
||||
(lambda (matches)
|
||||
(list
|
||||
'cons
|
||||
(cadr matches)
|
||||
`(format
|
||||
(if s-lex-value-as-lisp "%S" "%s")
|
||||
,(intern (cadr matches)))))
|
||||
(s-match-strings-all "${\\([^}]+\\)}" fmt)))))
|
||||
|
||||
(defmacro s-lex-format (format-str)
|
||||
"`s-format` with the current environment.
|
||||
|
||||
FORMAT-STR may use the `s-format' variable reference to refer to
|
||||
any variable:
|
||||
|
||||
(let ((x 1))
|
||||
(s-lex-format \"x is: ${x}\"))
|
||||
|
||||
The values of the variables are interpolated with \"%s\" unless
|
||||
the variable `s-lex-value-as-lisp' is `t' and then they are
|
||||
interpolated with \"%S\"."
|
||||
(declare (debug (form)))
|
||||
(s-lex-fmt|expand format-str))
|
||||
|
||||
(defun s-count-matches (regexp s &optional start end)
|
||||
"Count occurrences of `regexp' in `s'.
|
||||
|
||||
`start', inclusive, and `end', exclusive, delimit the part of `s' to
|
||||
match. `start' and `end' are both indexed starting at 1; the initial
|
||||
character in `s' is index 1.
|
||||
|
||||
This function starts looking for the next match from the end of the
|
||||
previous match. Hence, it ignores matches that overlap a previously
|
||||
found match. To count overlapping matches, use
|
||||
`s-count-matches-all'."
|
||||
(declare (side-effect-free t))
|
||||
(save-match-data
|
||||
(with-temp-buffer
|
||||
(insert s)
|
||||
(goto-char (point-min))
|
||||
(count-matches regexp (or start 1) (or end (point-max))))))
|
||||
|
||||
(defun s-count-matches-all (regexp s &optional start end)
|
||||
"Count occurrences of `regexp' in `s'.
|
||||
|
||||
`start', inclusive, and `end', exclusive, delimit the part of `s' to
|
||||
match. `start' and `end' are both indexed starting at 1; the initial
|
||||
character in `s' is index 1.
|
||||
|
||||
This function starts looking for the next match from the second
|
||||
character of the previous match. Hence, it counts matches that
|
||||
overlap a previously found match. To ignore matches that overlap a
|
||||
previously found match, use `s-count-matches'."
|
||||
(declare (side-effect-free t))
|
||||
(let* ((anchored-regexp (format "^%s" regexp))
|
||||
(match-count 0)
|
||||
(i 0)
|
||||
(narrowed-s (substring s
|
||||
(when start (1- start))
|
||||
(when end (1- end)))))
|
||||
(save-match-data
|
||||
(while (< i (length narrowed-s))
|
||||
(when (s-matches? anchored-regexp (substring narrowed-s i))
|
||||
(setq match-count (1+ match-count)))
|
||||
(setq i (1+ i))))
|
||||
match-count))
|
||||
|
||||
(defun s-wrap (s prefix &optional suffix)
|
||||
"Wrap string S with PREFIX and optionally SUFFIX.
|
||||
|
||||
Return string S with PREFIX prepended. If SUFFIX is present, it
|
||||
is appended, otherwise PREFIX is used as both prefix and
|
||||
suffix."
|
||||
(declare (pure t) (side-effect-free t))
|
||||
(concat prefix s (or suffix prefix)))
|
||||
|
||||
|
||||
;;; Aliases
|
||||
|
||||
(defalias 's-blank-p 's-blank?)
|
||||
(defalias 's-blank-str-p 's-blank-str?)
|
||||
(defalias 's-capitalized-p 's-capitalized?)
|
||||
(defalias 's-contains-p 's-contains?)
|
||||
(defalias 's-ends-with-p 's-ends-with?)
|
||||
(defalias 's-equals-p 's-equals?)
|
||||
(defalias 's-less-p 's-less?)
|
||||
(defalias 's-lowercase-p 's-lowercase?)
|
||||
(defalias 's-matches-p 's-matches?)
|
||||
(defalias 's-mixedcase-p 's-mixedcase?)
|
||||
(defalias 's-numeric-p 's-numeric?)
|
||||
(defalias 's-prefix-p 's-starts-with?)
|
||||
(defalias 's-prefix? 's-starts-with?)
|
||||
(defalias 's-present-p 's-present?)
|
||||
(defalias 's-starts-with-p 's-starts-with?)
|
||||
(defalias 's-suffix-p 's-ends-with?)
|
||||
(defalias 's-suffix? 's-ends-with?)
|
||||
(defalias 's-uppercase-p 's-uppercase?)
|
||||
|
||||
|
||||
(provide 's)
|
||||
;;; s.el ends here
|
||||
BIN
elpa/s-20180406.808/s.elc
Normal file
BIN
elpa/s-20180406.808/s.elc
Normal file
Binary file not shown.
7
init.el
7
init.el
@@ -26,15 +26,20 @@ There are two things you can do about this warning:
|
||||
("a24c5b3c12d147da6cef80938dca1223b7c7f70f2f382b26308eba014dc4833a" "a7051d761a713aaf5b893c90eaba27463c791cd75d7257d3a8e66b0c8c346e77" default)))
|
||||
'(package-selected-packages
|
||||
(quote
|
||||
(json-mode flymake-json tss tide material-theme zenburn-theme ac-js2 auto-complete projectile helm js2-mode cargo rust-mode))))
|
||||
(flycheck-rust flycheck json-mode flymake-json tss tide material-theme zenburn-theme ac-js2 auto-complete projectile helm js2-mode cargo rust-mode))))
|
||||
(custom-set-faces
|
||||
;; custom-set-faces was added by Custom.
|
||||
;; If you edit it by hand, you could mess it up, so be careful.
|
||||
;; Your init file should contain only one such instance.
|
||||
;; If there is more than one, they won't work right.
|
||||
)
|
||||
|
||||
(require 'rust-mode)
|
||||
(add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode))
|
||||
(setq rust-format-on-save t)
|
||||
(add-hook 'rust-mode-hook 'cargo-minor-mode)
|
||||
(with-eval-after-load 'rust-mode
|
||||
(add-hook 'flycheck-mode-hook #'flycheck-rust-setup))
|
||||
(add-to-list 'auto-mode-alist '("\\.js\\'" . js2-mode))
|
||||
(require 'helm-config)
|
||||
(projectile-mode +1)
|
||||
|
||||
Reference in New Issue
Block a user